4

我正在使用 aforms.ModelForm来设置模型的属性。对于其中一个属性,我想设置一个默认值,并且我想在表单中处理它,因此default=value在模型类中的模型属性上没有。

但是,在表单上,​​我不想向用户显示该值,甚至不是隐藏值,因此,我无法将字段放入其中,因此,我fields=(...)无法使用field.initial=value设置默认值的方式.

我可以覆盖验证或保存方法并在其中压缩属性设置,但这不是我更愿意做的。

有没有“正确”或更优雅的方法来解决这个问题?

4

4 回答 4

11

首先,从模型表单中排除私有字段。

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        exclude = ["private_field"]

通常,如果我想使用与模型定义中不同的默认值,我会在视图中设置它。

if form.is_valid():
    my_model = form.save(commit=False)
    my_model.private_field = "default value"
    my_model.save()

如果您不想在视图中设置值,我建议您覆盖 clean 方法并在那里执行。我不清楚你为什么不想这样做,或者关于不同的方法有什么更“合适”的。

class MyModelForm(forms.ModelForm):
    def clean(self):
        self.instance.private_field = "default value"
        return super(MyModelForm, self).clean()

    class Meta:
        model = MyModel
        exclude = ["private_field"]
于 2013-11-06T15:44:34.260 回答
1

您可能不想让用户为表单设置自己的值,所以保持它的最好方法是排除字段,就像这样

class MyForm(forms.ModelForm);
    class Meta:
        model = MyModel
        exclude = [myfield]

然后在视图中,假设是一个创建,

class MyView(CreateView):
     model = MyModel
     form_class = MyForm
     def form_valid(self, form):
         # Save the validated data of your object
         self.object = form.save(commit = False)
         # Update the value of the desired field
         self.object.myfield = # Your value.
         # Save the object to commit the changes
         self.object.save()
         # Response with the success url or whatever is default
         return super(MyView, self).form_valid(form)

这样你就完成了,当你在你的模型中得到完整的验证时,它对你和用户都是安全的。

于 2013-11-06T15:48:39.633 回答
0

在提交表单后的视图中:

form(request.POST, initial={'field':value})

还是覆盖cleanclean_field在您的表单中并在那里设置默认值?

还有一件事,您正在使用 a ModelForm,为什么要为该属性添加一个字段?只需将其保留在模型中并设置默认值即可。

于 2013-11-06T15:40:03.557 回答
0

if you just want to set an initial value in the form,

form = MyForm(initial={'field': field_var})

于 2020-12-24T06:21:13.273 回答