【问题标题】:pass form errors in TemplateView in Django?在 Django 的 TemplateView 中传递表单错误?
【发布时间】:2014-05-21 17:53:57
【问题描述】:

这就是我的views.py 的样子:

class HomePageView(TemplateView):

    template_name="home.html"

    def dispatch(self,request,*args,**kwargs):
        if not request.user.is_authenticated():
            raise http.Http404
        return super(HomePageView,self).dispatch(request,*args,**kwargs)

我的home.html

{% extends "base.html" %}
{% block content %}
{% if  user.is_authenticated %}

 ### display some user specic data
 {% else %}
 <form class="navbar-form navbar-right" role="form" action="" method="post">
          {% csrf_token %}
           {% if form.errors %}
<p>Your username and password didn't match. Please try again.ohh!</p>
            {% endif %}
            <div class="form-group">

            {{ form.username.label_tag }}
              <input type="text" placeholder="Uname or Email" class="form-control" name="username">
            </div>
            <div class="form-group">
              <input type="password" placeholder="Password" class="form-control" name="password">
            </div>
            <button type="submit" class="btn btn-success">Sign in</button>
          </form>
{% endif %}
{% endblock %}

urls.py:

urlpatterns = patterns('',
    # Examples:
    url(r'^$', HomePageView.as_view(), name='home'),)

我面临两个问题: 当我转到http://127.0.0.1:8000/(作为 GET 请求)时,我收到 404 错误。 在 GET 请求的情况下,我仍然想重定向到home.html,因为那将显示登录表单

在 POST 请求的情况下,我想重定向到 'home.html` 将在用户登录时处理。

如果有日志记录错误,我想将该信息作为 form.errors 传递到模板中呈现。

我很难实现这些。这里有什么指点吗?

【问题讨论】:

标签: django django-class-based-views django-users django-generic-views


【解决方案1】:

FormView 肯定会帮助您处理登录表单验证和错误处理:

from django.core.urlresolvers import reverse

class LoginView(FormView):
    template_name="login_form.html"
    form_class = LoginForm
    success_url = reverse('home')

不过,我不会尝试在该视图中添加太多其他内容,因此我建议您将 HomePageView 拆分为单独的视图。

FormView 将返回填充了字段错误和非字段错误的表单对象,然后您可以在模板中显示它们。像这样:

<form class="navbar-form navbar-right" role="form" action="" method="post">
{% csrf_token %}
 {{ form.non_field_errors }}
  <div class="form-group">
    <input type="text" placeholder="Uname or Email" class="form-control" name="username">
    {{ form.username.errors }}
  </div>
  <div class="form-group">
    <input type="password" placeholder="Password" class="form-control" name="password">
    {{ form.password.errors }}
  </div>
  <button type="submit" class="btn btn-success">Sign in</button>
</form>

这在 Django 文档中有很好的解释:https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

【讨论】:

    【解决方案2】:

    查看代码

        return render(request, 'my_template.html',
                      context={'form_errors': form.errors})
    

    html模板代码

     <span class="error">{{ form_errors.my_form_field_name }}</span>
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2011-12-29
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2014-08-09
      • 2021-04-21
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多