我想更改表单的初始字段填充。这是一个陷阱:我想为POST请求而不是GET请求更改它。
假设我的应用程序提供了一个基于体重输入的计算。如果用户输入体重,则使用该体重进行体重计算,否则使用默认值50。因此允许让字段为空。但是在计算运行之后,我想显示用于计算的值为50。这就是为什么我想在表单最初提交为空值后用50填充字段的原因。
# forms.py
class CalculatorForm(forms.Form):
body_weight = forms.FloatField(required=False)
def clean(self):
cleaned_data = super().clean()
if cleaned_data['body_weight'] is None:
cleaned_data['body_weight'] = 50.0
# ideally I want to put the logic here
# self.data[bpka] = 50.0 --> AttributeError: This QueryDict instance is immutable
# self.fields['body_weight'] = 50.0 --> does not work
# self.initial.update({'body_weight': 50.0}) --> does not work
return cleaned_data
我觉得问题是我无法从clean()
方法访问绑定字段。
如果在表单中不可能,我想逻辑必须转到视图。在这里随意修改:
class CalculatorView(FormView):
template_name = 'myapp/mycalculator.html'
form_class = CalculatorForm
def get_context_data(self, res=None, **kwargs):
context = super().get_context_data(**kwargs)
if res is not None:
context['result'] = res
return context
def form_valid(self, form, *args, **kwargs):
# form['body_weight'] = 50.0 --> does not work
res = form.cleaned_data['body_weight'] / 2
return render(
self.request,
self.template_name,
context=self.get_context_data(res=res, **kwargs)
)
1条答案
按热度按时间kd3sttzy1#
您可以重写
.form_valid
,因为当有效的表单数据已被POST时会调用该方法。通过这种方式,创建一个具有所需initial
值的CalculatorForm
的新示例,而不是返回默认的HttpResponseRedirect
,从而使用新表单呈现页面。保持表单的clean方法不变,然后将修改后的
form.cleaned_data
作为新示例化表单的初始dict传递。forms.py
views.py
myapp/mycalculator.html