Django - 为 ModelForm 中的字段分配默认值

Luc*_*Feo 5 python django

在我的应用程序中我有一个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,则 和cleanclean_a_field起作用,但除非我在模板内渲染一些内容,否则表单将不会验证<input name="a_field">,这不是最佳的。

Luc*_*Feo 4

我设法以一种令我满意的方式解决了这个问题,尽管我对代码仍然不是 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也可以节省我的时间。