问题描述
15 class Profile(models.Model):
16 """
17 User profile model
18 """
19 user = models.ForeignKey(User, unique=True)
20 country = models.CharField('Country', blank=True, null=True, default='',\
21 max_length=50, choices=country_list())
22 is_active = models.BooleanField("Email Activated")
我有一个如上所述的模型, country
设置为 blank = True,null = True
。
I have a model like above with country
set to blank=True, null=True
.
但是,以提交给最终用户的形式,我需要填写国家/地区字段。
However, in the form that is presented to the end user, I required the country field to be completed.
所以我重新定义了这样的模型窗体中的字段,以强制它成为必需的:
So I redefine the field in the Model Form like this to 'force' it to become required:
77 class ProfileEditPersonalForm(forms.ModelForm):
78
79 class Meta:
80 model = Profile
81 fields = ('email',
82 'sec_email',
83 'image',
84 'first_name',
85 'middle_name',
86 'last_name',
87 'country',
88 'number',
89 'fax',)
90
98 country = forms.ChoiceField(label='Country', choices = country_list())
所以国家字段只是一个例子(其中有吨)。有更好的DRY方法吗?
So the country field is just an example (there are tons of them). Is there a better more DRY way of doing this?
推荐答案
您可以修改 __ init __
。这是DRY,因为标签,查询器和其他一切将从模型中使用。这也可以用于覆盖其他东西(例如限制查询/选择,添加帮助文本,更改标签...)。
You can modify the fields in __init__
in the form. This is DRY since the label, queryset and everything else will be used from the model. This can also be useful for overriding other things (e.g. limiting querysets/choices, adding a help text, changing a label, ...).
class ProfileEditPersonalForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ProfileEditPersonalForm, self).__init__(*args, **kwargs)
self.fields['country'].required = True
class Meta:
model = Profile
fields = (...)
这是一篇博客文章,描述了相同的技术:
Here is a blog post that describes the same "technique": http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/
这篇关于Django模型表单 - 设置必填字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!