如何更改 Django 表单显示的默认错误消息

How to change the default error messages displayed by Django forms

我在 Django 中创建了一个表单,其中包含 max_length=255 的字符字段,如下所示:

task = models.CharField(max_length= 255)

现在我想让用户知道如果他超过了 255 个字符的限制,他输入了多少个字符,所以我做了以下操作

if form.is_valid():
    #some code
else:
    messages.info(request,(form.errors.get("task").as_text()))

现在假设如果我在表单字段中键入 445 个字符并提交然后 默认情况下我会收到以下错误消息:

* Ensure this value has at most 255 characters (it has 445).

但是,我想将此消息更改为:

Error: maximum length limit is 255 characters (it has 445).

所以我尝试了以下方法:

class ListForm(ModelForm):
    class Meta:
        model = ListModel
        fields = ["task", "status"]

        error_messages = {
            'task': {
                'max_length': ("Error: maximum length limit is 255 characters"),
                
            },
        }

现在留言已更改为:

* Error: maximum length limit is 255 characters.

我的问题:

  1. 我不想* 显示在消息前面
  2. 我无法捕获用户输入的字符数,这些字符数显示在默认消息中,即 (it has 445)

我可以做什么来打印 Error: maximum length limit is 255 characters (it has 445). 而不是 * Error: maximum length limit is 255 characters.?

您可以在表单中使用 clean_<fieldname>(),例如:

def clean_task(self):
    task = self.cleaned_data.get("task")

    if len(task) > 255:
        raise ValidationError("Error: maximum length limit is 255 characters (it has %s.") % len(task)

    return task

https://docs.djangoproject.com/en/3.1/ref/forms/validation/#cleaning-a-specific-field-attribute

I don't want the * which is being displayed in front of the messages

你最终得出结论(在评论中)的问题在

form.errors.get("task").as_text()

这会向客户端发送一个 <ul> HTML 元素而不是纯文本。所以你能做的,解决这个问题和你的 其他问题 只是检查 max_length 是否可以在 form.errors 中找到并使用你自己的 string.在 form.is_valid 被调用

之后,您应该会看到以下内容
# After this point form.is_valid() has been called
if "max_length" in form.errors:
    task = request.POST.get("task") # Get the text that was entered in `task`
    length_of_task = len(task) 
    # Simply send your own message
    messages.info(request, f"Error: maximum length limit is 255 characters (it has {length_of_task}).")

这里注意几点

  • 使用 request.POST.get
  • 访问数据

@SaeX指出可以使用self.cleaned_data.get来获取在POST请求中发送的数据。虽然这是真的,但 它仅在 form.is_valid 返回 true 时有效。您可以了解更多 here.

  • 如果我想捕获多个错误并使用字典怎么办

您仍然可以使用字典,但对于值,您将不得不使用函数。类似下面的内容

def handle_max_length(data):
    datalen = len(data) > 255 # Do your stuff
    
def handle_some_other_error(data):
    pass 

errors = {
    'max_length' : handle_max_length,
    'some_other_error': handle_some_other_error
}

def myView(request):
    # ... code
    form = MyForm()
    if not form.is_valid():
        for field in form.errors:
            field_value = request.POST.get(field)
            for error in field:
                messages.info(
                    request, errors.get(error)(field_value) # Getting the function and calling it with the data
                )