如何在 Django 表单中 DRY(我自己)以创建和编辑表单
How to DRY (myself) in Django form for Create and Edit Form
我在 Django 中为同一个模型创建了两个表单,分别命名为 AccountCreateForm
和 AccountEditForm
。 Account
模型有三个字段,每个字段都有一些表单属性,例如 max_length
、help_text
、error_messages
。例如,
class AccountCreateForm(forms.Modelform):
name = forms.CharField(max_length=50, required=True, label='Account Name', help_text='50 characters max', error_messages={'required': 'Please enter the account name'})
number = forms.CharField(max_length=16, required=True, label='Phone Number', help_text='10-16 digits max', error_messages={'required': 'Please enter the phone numbername'})
我希望用户也能够编辑现有帐户。因此,我添加了另一个用于编辑目的的表格,如下所示。
class AccountEditForm(forms.Modelform):
name_error = { 'max_length': ("Name should be no longer than 50 characters."), 'required': ("Please enter the account name")}
number_error = {'max_length': ("Phone number should be between 10-16 characters."),'min_length': ("Phone number should be between 10-16 characters."),'required': ("Please enter the phone number tied to the Twilio account")}
name = forms.CharField(max_length=50, required=True, label='Account Name', help_text='50 characters max', error_messages=name_error)
number = forms.CharField(max_length=16, required=True, label='Phone Number', help_text='10-16 digits max', error_messages=number_error)
我的 account_create.html
和 account_edit.html
模板共享如下简单代码:
<form method="post">
{% csrf_token %}
<p>
{% for field in form %}
{{ field.errors }}
<label for="{{ field.id_for_label }}">{{ field.label }}({{ field.help_text }}):</label>
<br />
{{ field }}<br /><br />
{% endfor %}
</p>
<input class="btn btn-primary done-btn" type="submit" value="Create New Account">
</form>
它工作正常,Django 帮助提供错误消息和帮助文本。但是,我觉得我在这里重复了一些事情。我尝试了 Django documentation page 建议的方法,如下所示:
class AccountEditForm(forms.Modelform):
class Meta:
model = Account
fields = ('name', 'number')
labels = {'name' : _('Account Name'), 'number': _('Phone Number')}
error_messages = {
'name': {
'max_length': _("Name should be no longer than 50 characters."), 'required': ....}
等等。但是如果我故意离开,比如 name
字段,编辑表单中的空白,Django 不会显示错误。它显示错误的唯一方法似乎是第一种方法。我可以做些什么来提高代码质量(即不重复)?谢谢。
有两种方法可以做到这一点:-
1) 通过添加 'blank=False'.
使模型中的名称字段成为必填项
name = models.CharField(blank=False)
2) 如果您不想修改模型中字段的空白设置(这样做会破坏管理站点中的正常验证),您可以在表单 class 中执行以下操作:
def __init__(self, *args, **kwargs):
super(AccountEditForm, self).__init__(*args, **kwargs)
self.fields["name"].required = True
我在 Django 中为同一个模型创建了两个表单,分别命名为 AccountCreateForm
和 AccountEditForm
。 Account
模型有三个字段,每个字段都有一些表单属性,例如 max_length
、help_text
、error_messages
。例如,
class AccountCreateForm(forms.Modelform):
name = forms.CharField(max_length=50, required=True, label='Account Name', help_text='50 characters max', error_messages={'required': 'Please enter the account name'})
number = forms.CharField(max_length=16, required=True, label='Phone Number', help_text='10-16 digits max', error_messages={'required': 'Please enter the phone numbername'})
我希望用户也能够编辑现有帐户。因此,我添加了另一个用于编辑目的的表格,如下所示。
class AccountEditForm(forms.Modelform):
name_error = { 'max_length': ("Name should be no longer than 50 characters."), 'required': ("Please enter the account name")}
number_error = {'max_length': ("Phone number should be between 10-16 characters."),'min_length': ("Phone number should be between 10-16 characters."),'required': ("Please enter the phone number tied to the Twilio account")}
name = forms.CharField(max_length=50, required=True, label='Account Name', help_text='50 characters max', error_messages=name_error)
number = forms.CharField(max_length=16, required=True, label='Phone Number', help_text='10-16 digits max', error_messages=number_error)
我的 account_create.html
和 account_edit.html
模板共享如下简单代码:
<form method="post">
{% csrf_token %}
<p>
{% for field in form %}
{{ field.errors }}
<label for="{{ field.id_for_label }}">{{ field.label }}({{ field.help_text }}):</label>
<br />
{{ field }}<br /><br />
{% endfor %}
</p>
<input class="btn btn-primary done-btn" type="submit" value="Create New Account">
</form>
它工作正常,Django 帮助提供错误消息和帮助文本。但是,我觉得我在这里重复了一些事情。我尝试了 Django documentation page 建议的方法,如下所示:
class AccountEditForm(forms.Modelform):
class Meta:
model = Account
fields = ('name', 'number')
labels = {'name' : _('Account Name'), 'number': _('Phone Number')}
error_messages = {
'name': {
'max_length': _("Name should be no longer than 50 characters."), 'required': ....}
等等。但是如果我故意离开,比如 name
字段,编辑表单中的空白,Django 不会显示错误。它显示错误的唯一方法似乎是第一种方法。我可以做些什么来提高代码质量(即不重复)?谢谢。
有两种方法可以做到这一点:-
1) 通过添加 'blank=False'.
使模型中的名称字段成为必填项 name = models.CharField(blank=False)
2) 如果您不想修改模型中字段的空白设置(这样做会破坏管理站点中的正常验证),您可以在表单 class 中执行以下操作:
def __init__(self, *args, **kwargs):
super(AccountEditForm, self).__init__(*args, **kwargs)
self.fields["name"].required = True