在我的应用程序中,我有一个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
,则clean
和clean_a_field
将有效,但除非我渲染{{1},否则表单不会生效在模板内部,这不是最佳的。
答案 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)
我有办法面对这种情况。请遵循以下流程:
从AForm中排除删除'a_field'。
不要在HTML模板中公开'a_field'。即,不要让用户选择通过模板中的表单更改值。这将确保普通用户不会修改该值。
要在视图中完全阻止覆盖 get_form_kwargs
。
这将为“a_field”提供或覆盖您想要的值并保存
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