【问题标题】:How do I use error_messages on models in Django如何在 Django 中的模型上使用 error_messages
【发布时间】:2011-01-25 20:13:34
【问题描述】:

我从文档 http://docs.djangoproject.com/en/dev/ref/models/fields/ 中了解到,您可以将 error_messages 添加到模型字段并提供您自己的错误消息字典。但是,您应该传递的 dict 的键是什么?

class MyModel(models.Model):
   some_field = models.CharField(max_length=55, error_messages={'required': "My custom error"})

如果在使用的模型上更容易做到这一点,那也可以。我宁愿不必再次显式创建每个字段及其类型。这是我试图避免的:

class MyModelForm(forms.ModelForm):
    some_field = forms.CharField(error_messages={'required' : 'Required error'})

更新 2:我的项目中使用的测试代码

我的模特:

class MyTestModel(models.Model):
    name = models.CharField(max_length=127,error_messages={'blank' : 'BLANK','required' : 'REQUIRED'})

我的表格:

class EditTestModel(ModelForm):
    class Meta:
        model = MyTestModel

我的观点:

tf = EditTestModel({'name' : ''})

print tf.is_valid() # prints False
print tf.full_clean() # prints None
print tf # prints the form, with a <li> error list containg the error "This field is required"


<tr><th><label for="id_name">Name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input id="id_name" type="text" name="name" maxlength="127" /></td></tr>

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    你说得对,那些文档不是很有用。毕竟是最近添加的!

    我的猜测是 error_messages 的正常用法是用于 ModelForms,所以我会在这里查找每个字段可接受的错误键列表:http://docs.djangoproject.com/en/dev/ref/forms/fields/#error-messages

    但是,如果你想真正安全,不做任何假设......

    目前最可靠的方法是查看django/db/models/fields/__init__.py 的源代码,在那里您将看到可以指定的每个default_error_messages 以及对self.error_messages['invalid'] 的实际调用

    # Field (base class)
    
    default_error_messages = {
        'invalid_choice': _(u'Value %r is not a valid choice.'),
        'null': _(u'This field cannot be null.'),
        'blank': _(u'This field cannot be blank.'),
    }
    
    # AutoField  
        default_error_messages = {
            'invalid': _(u'This value must be an integer.'),
        }
    

    这是关于模型验证的文档: http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

    更新:

    刚刚在 shell 会话中对此进行了测试,它似乎可以正常工作。怎么了?

    我刚刚定义了一个简单的模型:

    class SubscriptionGroup(models.Model):
        name = models.CharField(max_length=255, error_messages={'blank': 'INVALID!!11', 'null': 'NULL11!'})
    
    # shell
    >>> s = SubscriptionGroup()
    >>> s.full_clean()
    ValidationError: {'name': [u'INVALID!!11']}
    

    【讨论】:

    • 我查看了您提到的源文件并得出了相同的结论。正如您在我的示例中看到的,我在 error_messages 中传递了一个“必需”键,但它不起作用。也许我在某个地方做错了什么,我将不得不继续测试。谢谢!
    • 嗯,它对我有用!愿意发布您的代码吗?我正在更新我的以显示我的 shell 会话。
    • 太奇怪了,我添加了我在应用程序中使用的代码。现在我正在使用我试图避免的方法。但是,您的示例显然有效,并且是正确的方法。
    • 嗯,尽管我在回答中写了一句话,但看起来这是模型表单不继承模型清理验证器的预期行为。 code.djangoproject.com/ticket/13693(我的方法是使用模型验证,不是表单验证)
    【解决方案2】:

    (这个有点晚了,但我自己也遇到过同样的问题,所以把它用作 note_to_self 和任何东西一样多。)

    您可以在模型和模型窗体上指定error_messages。您应该/可以使用的键是为表单字段定义的here。问题似乎是(对我而言)表单和相关模型之间的相互关系,以及出现哪些错误消息以及何时出现。关键是要理解表单和模型实际上是非常松散耦合的,并且真的没有魔法发生。

    如果您有一个名为 'quote' 的模型字段,max_length 为 140,并且有一个与此模型关联的模型表单,则错误消息将按以下方式工作:

    • 如果您不显式向模型表单添加 max_length 属性,然后验证表单(调用 is_valid()errors),返回的错误消息将来自型号。
    • 如果您将一组error_messages ('required','max_length') 添加到模型中,这些将出现在错误集合中。
    • 如果您将一组 error_messages 添加到模型表单,它们将不会出现,因为验证失败的是模型,而不是表单。
    • 如果您随后将 max_length 属性添加到模型表单,您将看到模型表单错误浮出水面(并覆盖模型 error_messages。)

    所以 - 总之相当简单 - 错误消息映射到正在验证的对象 - 可以是模型或模型形式。

    【讨论】:

      【解决方案3】:

      我试过了。如果您在模型中定义它,它将不起作用。 您必须像这样在表单中定义error_messages

      name = forms.CharField(error_messages={'required': 'this field is required'})
      

      【讨论】:

        猜你喜欢
        • 2015-12-02
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多