【问题标题】:django: how to access only first error message in form.errors?django:如何仅访问 form.errors 中的第一条错误消息?
【发布时间】:2013-09-27 19:23:31
【问题描述】:

我有一个名为 Users 的模型,我有一个用于该模型的表单,称为 UsersForm。在我的views.py中,我创建了一个版本的UsersForm,就像这样

form = UsersForm()
if reqest.method == POST:
    form = UsersForm(request.POST)
    if form.is_valid():
        form.save()
    c = {}
    c.update(csrf(request))
    c.update({'form':form})
    return render_to_response('home_page.html', c)

现在,我的 home_page.html 是这样的:

<html>
    <body>

    <form method="post" action="">{% csrf_token %}
        {{ form }}
    <input type="submit" value="Register"/>
    </form>

    {% if form.errors %}
        {% for field in form %}
            <p> {{field.errors}} </p>
        {% endfor %}
    {% endif %}
    </body>
</html>

所以,我想要的是,我只想显示 {{ field.errors}} 中的第一个错误。 我当时的想法是这样的:

    {% if form.errors %}
        {% for field in form %}
            <p> {{field.errors}} </p> {{ break}}
        {% endfor %}
    {% endif %}

但是 django 模板语言并没有中断,对吧?我还尝试考虑使用 {% for field in form|slice:":1" %} 但这也行不通。有人知道怎么做吗?

【问题讨论】:

    标签: django django-templates django-views django-forms


    【解决方案1】:

    走模板标签路线。

    这是一个示例模板标签:

    from django.template.defaulttags import register
    
    @register.filter(name='show_error')
    def show_error(dictionary):
        try:
            return dictionary.values()[0][0]
        except (TypeError,IndexError,AttributeError):
            return 'tip: try again'
    

    并像这样在您的模板中使用它:

    {% if form.errors %}{{ form.errors|show_error }}</span>{% endif %}
    

    【讨论】:

    • 只需要一点小改动就能搞定:list(dictionary.values())[0][0]
    【解决方案2】:

    您可以使用点符号来索引 django 模板中的列表:

    {{ field.errors.0 }}
    

    在执行此操作之前,请务必检查至少存在 1 个错误,否则您将收到 Index out of range 错误。

    【讨论】:

    • 嗯,它不工作。我所做的是 {% if field.errors %}

      {% field.errors.0 %} {% endif %}.. 我也尝试替换“if field.errors”.. 作为澄清,我不'不想在每个字段中显示第一个错误,我只想显示第一个字段错误。

    • {{ form.errors.0 }} 会这样做吗?在我的脑海中,我不记得是否有所有错误,或者只是表单级错误。
    • 嗯,它不起作用,即使我故意犯错误也没有给出任何错误:/我尝试的是 {% if form.errors %} {{ form.errors.0 } } {% endif %}
    • 我知道您可以执行 {% for field in form %} {{ field.errors.0 }} {% endfor %} 但这只会显示每个字段中的第一个错误。我只希望它只返回一个(第一个)它遇到的错误,而不是任何其他字段,无论是否有更多字段错误。
    猜你喜欢
    • 2013-09-30
    • 2016-12-12
    • 2012-06-04
    • 1970-01-01
    • 2011-11-07
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多