由于 Django 中的 max_length 限制和 min_length 限制导致 ValidationError 时如何引发不同的消息
How to raise different messages when the ValidationError is caused due to max_length limit and min_length limit in Django
我想在 Django 中创建一个模型,我可以在其中为给定字段(任务)引入字符值,其中 min_limit=1 和 max_limit=255。 models.py 文件中的代码类似于:
class ListModel(models.Model):
task = models.CharField(max_length= 255, validators = [MinLengthValidator(1), MaxLengthValidator(255)])
status = models.BooleanField(default=False)
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ["task", "status"]
现在,如果表单无效,我想显示不同的消息,具体取决于它是因为 max_length>255 还是因为 min_length<1 而无效,代码会是这样的在 views.py 文件中像这样:
def index(request):
if request.method == 'POST':
form = ListForm(request.POST)
if form.is_valid():
#some code
else:
if max_length > 255:
messages.info(request, ('Maximum length limit: 255 characters!'))
else:
messages.info(request, ('No Task added!')
return redirect('index')
else:
#some code
class MaxLengthValidator(limit_value, message=None)
¶
Raises a ValidationError with a code of 'max_length' if the length of
value is greater than limit_value, which may be a callable.
在 documentation 中提到 max_length 是可调用的,但我不确定如何在 views.py 中调用它。当 max_length>255 和 min_length<1 时如何显示不同的消息?
您必须自己浏览大部分代码。
访问 views.py
中的表单错误
if form.is_valid():
#some code
else:
print(form.errors.get("task"))
form.errors()
将 return html
然后你可以随心所欲地操纵你的代码
在我的例子中,我使用 beautifulSoup 来解析 html,清理它并用条件检查
最后,我的问题有两个解决方案
解决方案 1(这就是我要找的):
if form.is_valid():
#some code
else:
task = request.POST.get("task")
if len(task) > 255:
messages.info(request, f"Maximum length limit is 255 characters, but your task has {len(task)} characters")
elif len(task) < 1:
messages.info(request, ('No Task added!')
return redirect('index')
方案二:
在 views.py 中的代码如下所示:
if form.is_valid():
#some code
else:
messages.info(request,(form.errors.get("item").as_text()))
return redirect('index')
并且在 forms.py 或 models.py 中,无论您的表单 class 在哪里,代码将是:
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ["task", "status"]
error_messages = {
'task': {
"required": ("No task added!"),
'max_length': ("Maximum length limit: 255 characters!"),
},
}
解决方案 1 优于解决方案 2 的优点是即使 form.is_valid() 为 False,我们也可以显示用户键入的字符数,这我不确定是否可以用第二种方法完成,但如果也可以使用第二种方法完成,请在评论中告诉我:)
我想在 Django 中创建一个模型,我可以在其中为给定字段(任务)引入字符值,其中 min_limit=1 和 max_limit=255。 models.py 文件中的代码类似于:
class ListModel(models.Model):
task = models.CharField(max_length= 255, validators = [MinLengthValidator(1), MaxLengthValidator(255)])
status = models.BooleanField(default=False)
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ["task", "status"]
现在,如果表单无效,我想显示不同的消息,具体取决于它是因为 max_length>255 还是因为 min_length<1 而无效,代码会是这样的在 views.py 文件中像这样:
def index(request):
if request.method == 'POST':
form = ListForm(request.POST)
if form.is_valid():
#some code
else:
if max_length > 255:
messages.info(request, ('Maximum length limit: 255 characters!'))
else:
messages.info(request, ('No Task added!')
return redirect('index')
else:
#some code
class MaxLengthValidator(limit_value, message=None)
¶
Raises a ValidationError with a code of 'max_length' if the length of value is greater than limit_value, which may be a callable.
在 documentation 中提到 max_length 是可调用的,但我不确定如何在 views.py 中调用它。当 max_length>255 和 min_length<1 时如何显示不同的消息?
您必须自己浏览大部分代码。
访问 views.py
if form.is_valid():
#some code
else:
print(form.errors.get("task"))
form.errors()
将 return html
然后你可以随心所欲地操纵你的代码
在我的例子中,我使用 beautifulSoup 来解析 html,清理它并用条件检查
最后,我的问题有两个解决方案
解决方案 1(这就是我要找的):
if form.is_valid():
#some code
else:
task = request.POST.get("task")
if len(task) > 255:
messages.info(request, f"Maximum length limit is 255 characters, but your task has {len(task)} characters")
elif len(task) < 1:
messages.info(request, ('No Task added!')
return redirect('index')
方案二:
在 views.py 中的代码如下所示:
if form.is_valid():
#some code
else:
messages.info(request,(form.errors.get("item").as_text()))
return redirect('index')
并且在 forms.py 或 models.py 中,无论您的表单 class 在哪里,代码将是:
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ["task", "status"]
error_messages = {
'task': {
"required": ("No task added!"),
'max_length': ("Maximum length limit: 255 characters!"),
},
}
解决方案 1 优于解决方案 2 的优点是即使 form.is_valid() 为 False,我们也可以显示用户键入的字符数,这我不确定是否可以用第二种方法完成,但如果也可以使用第二种方法完成,请在评论中告诉我:)