【问题标题】:How to raise different messages when the ValidationError is caused due to max_length limit and min_length limit in Django由于 Django 中的 max_length 限制和 min_length 限制导致 ValidationError 时如何引发不同的消息
【发布时间】:2021-01-09 10:45:08
【问题描述】:

我想在 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_lengthviews.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)
如果长度为 value 大于 limit_value,可能是可调用的。

documentation 中提到 max_length 是可调用的,但我不确定如何在 views.py 中调用它。当 max_length>255 和 min_length

【问题讨论】:

    标签: django django-models django-forms django-validation


    【解决方案1】:

    您必须自己浏览大部分代码。 访问views.py中的表单错误

    if form.is_valid():
        #some code
    else:
        print(form.errors.get("task"))
    

    form.errors() 将返回 html 然后你可以随心所欲地操作你的代码

    在我的例子中,我使用 beautifulSoup 来解析 html,清理它并使用条件检查

    【讨论】:

    • 我的意思是说“form.errors 将返回......”而不是“form.errors() 将返回......”
    • 非常感谢您让我知道form.errors,因为我是 Django 新手。在我的情况下,在form.errors.get("task").as_text() 上使用条件解决了我的问题。
    【解决方案2】:

    最后,我的问题有两个解决方案

    解决方案 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')
    

    解决方案 2:

    views.py 中的代码如下所示:

    if form.is_valid():
        #some code
    else:
        messages.info(request,(form.errors.get("item").as_text()))
        return redirect('index')
    

    forms.pymodels.py 中,无论您的 Form 类在哪里,代码都是:

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

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多