如何设置表单字段默认值而不显示django表单中的字段?

时间:2013-11-06 15:23:07

标签: python django

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

在表单上,​​我不想向用户显示值,甚至不显示隐藏值,因此,我不能将字段放在fields=(...)中,因此,我可以'使用field.initial=value方式设置默认值。

我可以覆盖验证或保存方法并在那里挤压属性设置,但这不是我想要做的。

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

3 个答案:

答案 0 :(得分:10)

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

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"]

答案 1 :(得分:1)

您可能不想让用户为表单设置自己的值,因此保持这种情况的最佳方法是排除字段,如此

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

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

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)

通过这种方式,您已经完成了,并且在您的模型中获得完整验证后,对您和用户都是安全的。

答案 2 :(得分:0)

在提交表单后的视图中:

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

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

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