如何在 Django 表单中 DRY(我自己)以创建和编辑表单

How to DRY (myself) in Django form for Create and Edit Form

我在 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) 通过添加 '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