【问题标题】:How to send additional data to the template when Django ValidationError occurred on a specific field?当特定字段上发生 Django ValidationError 时,如何向模板发送附加数据?
【发布时间】:2016-05-25 00:10:53
【问题描述】:

假设,我有一个 Django 表单 - XYZ,其中包含字段 A、B、C。字段 B 是用户名字段,当特定的用户名已经存在时,会发生验证错误并返回一条消息。除此之外,我想向模板发送一些自动建议的用户名字典。 据我了解,我只能发送字段错误和非字段错误。

def clean_B(self):
        B = self.cleaned_data['B']
        if address.objects.filter(B=B).exists():
            raise forms.ValidationError("Username already exists")
        return B

我尝试使用 Form.add_error() 添加另一个错误,但 Django 不允许在每个字段的单个字典中出现多个错误或 Non_field 错误。

我该怎么做?

谢谢!

【问题讨论】:

  • 为什么不能将它添加到当前ValidationError 的消息中?你可以对cleaned_data做任何你想做的事情来产生一些建议,然后做:raise forms.ValidationError("Username already exists, please try foo, bar or baz instead")
  • 我想让它更加用户友好(比如 Gmail 自动建议)。用户只需点击“foo”/“bar”,即可填写用户名字段!!错误信息不同,建议不同!!为此,我需要列表中的自动建议。

标签: django django-forms django-templates autosuggest validationerror


【解决方案1】:

我认为您可以使用django messages framework 向用户显示您的消息和建议。

from django.contrib import messages

...

def clean_B(self):
    B = self.cleaned_data['B']
    if address.objects.filter(B=B).exists():
        # In __init__ method of the form, you should store request as property
        messages.info(self.request, 'You should use another username, i.e. John')
        raise forms.ValidationError('Username already exists')
    return B

然后,在模板中的某处,输出消息:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

【讨论】:

  • 嗨 Astrikov,感谢您的回答,在这里使用消息很有意义。但是无法将请求数据获取到 clean_B 函数中。以及在这种情况下是否可用的良好做法。错误:AttributeError:“XYZCreateForm”对象没有属性“请求”
  • 正如我所说,您应该将 request 传递给您的 form kwargs 并将其作为属性存储在您的 __init__ 方法中
  • 嗨 Astrikov,虽然您的建议解决了主要问题,但我无法在消息中发送可用用户名的“dict”/json,消息只是转换为字符串!我需要在模板端执行一些可点击的功能,只有当消息是 dict/json 时才有可能。使用 ast.literal_eval() 时会抛出一些疯狂的错误。有没有办法直接将 json 或 dict 作为消息或错误发送到模板?
猜你喜欢
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2017-12-13
  • 2018-07-13
  • 2019-02-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多