在我的应用程序中我有一个CreateView必须使用默认值初始化模型的某些字段,该默认值与模型内部定义的默认值不同。
我不希望用户编辑该值,因此我将该字段放入列表exclude中
class AForm(ModelForm):
class Meta:
model = AModel
exclude = ['a_field']
class AView(CreateView):
form_class = AForm
Run Code Online (Sandbox Code Playgroud)
问题是:我在哪里设置的值a_field?
我尝试clean在里面定义方法AForm,就像这样
class AForm(ModelForm):
[...]
def clean(self):
d = super(AForm, self).clean()
d['a_field'] = 10
return d
Run Code Online (Sandbox Code Playgroud)
然而a_field设置为模型中定义的默认值,而不是10。我也尝试过定义clean_a_field,但根本没有执行。
a_field如果我从列表中删除exclude,则 和clean将clean_a_field起作用,但除非我在模板内渲染一些内容,否则表单将不会验证<input name="a_field">,这不是最佳的。
我设法以一种令我满意的方式解决了这个问题,尽管我对代码仍然不是 100% 满意。
a_field是必需的(模型)字段,因此有必要<input name="a_field">在模板内部渲染一个。诀窍是使a_field非必需:
class AForm(ModelForm):
a_field = Field(required=False,
widget=forms.HiddenInput)
class Meta:
model = AModel
def clean_a_field(self):
return 10
Run Code Online (Sandbox Code Playgroud)
这样我就可以避免在模板中渲染字段,并且表单仍然会验证。即使表单是用 渲染的{{ form.as_p }},widget=forms.HiddenInput也可以节省我的时间。
| 归档时间: |
|
| 查看次数: |
4982 次 |
| 最近记录: |