我正在使用forms.ModelForm
来设置模型的属性。对于其中一个属性,我想设置一个默认值,我想在表单中处理它,因此模型类中的model属性没有default=value
。
在表单上,我不想向用户显示值,甚至不显示隐藏值,因此,我不能将字段放在fields=(...)
中,因此,我可以'使用field.initial=value
方式设置默认值。
我可以覆盖验证或保存方法并在那里挤压属性设置,但这不是我想要做的。
是否有任何“正确”或更优雅的方法来解决这个问题?
答案 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})
或覆盖表单中的clean
或clean_field
并在那里设置默认值?
还有一件事,你正在使用ModelForm
,为什么要为该属性添加字段?只需将其保留在模型中并设置默认值即可。