【问题标题】:django form error messages not showingdjango 表单错误消息未显示
【发布时间】:2013-09-27 14:40:12
【问题描述】:

所以我有我的看法:

def home_page(request):
    form = UsersForm()
    if request.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)

我的表单.py:

class UsersForm(forms.ModelForm):

    class Meta:
        model = Users
        widgets = {'password':forms.PasswordInput()}

    def __init__(self, *args, **kwargs):
        super( UsersForm, self ).__init__(*args, **kwargs)
        self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name"  
        self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name"
        self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password"

还有我的模板:

<html>
    <body>

    <form method="post" action="">{% csrf_token %}
        {{ form.first_name }} {{form.last_name }} <br>
        {{ form.password }} <br>
        <input type="submit" value="Submit Form"/>
    </form>

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

    </body>
</html>

现在,请记住,在我拆分表单字段之前,我的表单看起来像这样:

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

如果表单有问题(例如缺少某个字段),它会自动给出错误消息。在我拆分模板中的表单字段(使 {{ form.first_name }}、{{ form.last_name }} 和 {{ form.password }} 成为它们自己的部分)后,它停止自动提供错误消息。这是正常的吗?

但主要问题是,如果有错误消息,我的 {{ if form.errors }} 语句为什么不起作用/显示错误消息?例如,如果我故意不填写表单中的字段并单击提交,则数据库不会获得更新(这是一件好事),但不会给出任何错误消息。知道为什么吗?

我还尝试删除 {{ forms.non_field_errors }} 并尝试仅返回字段错误,如下所示:

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

但还是不行。

【问题讨论】:

  • 你能修复视图方法中的缩进并准确显示视图代码的外观吗?
  • 哎呀,好了,刚刚修好了。
  • 同时检查内部{{ form.non_field_errors }}。把它放在{% if form.errors %} 外面。 Example.
  • 嗯好吧,我完全删除了 {{ forms.non_field_errors }},但它仍然无法正常工作。我更新了帖子并展示了我的尝试。
  • @user2719875 删除它不是我的意思,但很高兴看到它已解决。不过,放回非字段错误。将其放回 if 块之外。可能会派上用场。

标签: django django-models django-forms django-templates django-errors


【解决方案1】:

像这样在views.py中添加这个sn-ps

if request.method == "POST":
    fm = UserRegsitrationForm(request.POST)
    if fm.is_valid():
        fm.save()

    else:
        fm = UserRegsitrationForm()
    context = {'fm':fm}
    return render(request,'registration.html',context)

【讨论】:

  • 请解释你的代码是做什么的以及它是怎么做的。
  • 如果您的表单是有效的,它只会保存表单,否则它将转到 else 部分并返回错误的表单。
【解决方案2】:

错误捕获很可能通过以下方式完成:

{% for field in form %}
    {{ field.errors }}
{% endfor %}

【讨论】:

    【解决方案3】:

    如果 is_valid() 不正确,您必须再次发送表单上下文,

        if form.is_valid():
    
            return redirect('/user/contact/')
        else:
            return render(request, 'users/contact.html', context={'form': form})
    

    因为您的错误将显示在您的表单中 else: 会返回 ValueError

    【讨论】:

      【解决方案4】:

      我发现了错误(错字)。

      sn-p 应该是:

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

      我有errors 而不是error

      【讨论】:

        猜你喜欢
        • 2015-10-17
        • 1970-01-01
        • 2018-05-30
        • 2017-04-26
        • 2023-03-29
        • 2022-11-09
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        相关资源
        最近更新 更多