如何在Django表单中为创建和编辑表单干燥(我自己)

时间:2015-06-14 04:25:12

标签: django django-forms django-templates dry

我在Django中为同一个模型创建了两个表单,名为AccountCreateFormAccountEditFormAccount模型有三个字段,每个字段都有一些表单属性,例如max_lengthhelp_texterror_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.htmlaccount_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 个答案:

答案 0 :(得分:1)

有两种方法可以实现这一目标: -

1)通过添加&#39; blank = False&#39;来在模型中创建所需的名称字段。

    name = models.CharField(blank=False)

2)如果您不想修改模型中字段的空白设置(这样做会破坏管理网站中的正常验证),您可以在Form类中执行以下操作:

def __init__(self, *args, **kwargs):
    super(AccountEditForm, self).__init__(*args, **kwargs)

    self.fields["name"].required = True