如何更改 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.
我的问题:
- 我不想
*
显示在消息前面
- 我无法捕获用户输入的字符数,这些字符数显示在默认消息中,即
(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
)
我在 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.
我的问题:
- 我不想
*
显示在消息前面 - 我无法捕获用户输入的字符数,这些字符数显示在默认消息中,即
(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
)