由于 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.pymodels.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,我们也可以显示用户键入的字符数,这我不确定是否可以用第二种方法完成,但如果也可以使用第二种方法完成,请在评论中告诉我:)