Django - 将默认值指定给ModelForm中的字段

时间:2014-05-18 04:10:40

标签: python django

在我的应用程序中,我有一个CreateView,它必须使用默认值初始化模型的某些字段,这与模型中定义的默认值不同。

我不希望用户编辑该值,因此我将该字段放在exclude列表中

class AForm(ModelForm):
    class Meta:
        model = AModel
        exclude = ['a_field']

class AView(CreateView):
    form_class = AForm

问题是:我在哪里设置a_field的价值?

我尝试在clean中定义AForm方法,就像这样

class AForm(ModelForm):
    [...]
    def clean(self):
        d = super(AForm, self).clean()
        d['a_field'] = 10
        return d

a_field设置为模型中定义的默认值,而不是10。我也尝试过定义clean_a_field,但这根本就没有执行。

如果我从a_field列表中删除exclude,则cleanclean_a_field将有效,但除非我渲染{{1},否则表单不会生效在模板内部,这不是最佳的。

4 个答案:

答案 0 :(得分:4)

从表单中排除字段,然后在视图中,您可以在保存表单之前设置值:

form = AForm(request.POST)
if form.is_valid():
    new_record = form.save(commit=False)
    new_record.a_field = 10
    new_record.save()

您还可以避免使用exclude列表,并指定您希望在表单定义的fields attr中包含哪些字段。请参阅第here in the docs段。

答案 1 :(得分:1)

我设法以令我满意的方式解决了这个问题,尽管我对这段代码仍然不是很满意。

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

这样我可以避免在模板中渲染字段,表单仍然会验证。即使表单是使用{{ form.as_p }}呈现的,widget=forms.HiddenInput也可以节省我的一天。

答案 2 :(得分:0)

您在模型中设置默认值。来自官方document
a_field = models.CharField(max_length = 7,默认=&#39;&#39;),例如

答案 3 :(得分:0)

我有办法面对这种情况。请遵循以下流程:

  1. 从AForm中排除删除'a_field'。

  2. 不要在HTML模板中公开'a_field'。即,不要让用户选择通过模板中的表单更改值。这将确保普通用户不会修改该值。

  3. 要在视图中完全阻止覆盖 get_form_kwargs。 这将为“a_field”提供或覆盖您想要的值并保存

  4. e.g。

    class AView(CreateView):
        form_class = AForm
    
        def get_form_kwargs(self):
            kwargs = super(AView, self).get_form_kwargs()
            if self.request.method in {'POST', 'PUT'}:
                # Change post data to over-ride or provide value of 'a_field'
                data = self.request.POST.copy()
                data.update({
                    'a_field': 'value'
                })
                kwargs['data'] = data
            return kwargs