如何在Django模板中不使用{{form}}时处理错误消息?

时间:2016-09-04 01:36:36

标签: django django-forms django-login

我实施了Login,除了错误消息外,它的效果很好。

如果我使用{{ form.as_p }},则会显示错误消息。

<form id="loginform" class="form-horizontal" role="form" method="post" action="{% url 'users:login' %}">
    {% csrf_token %}
    <!-- id / pw -->
    {{ form.as_p }}
    <div class="form-group">
        <!-- Button -->
        <div class="btn-controls">
            <div class="row">
                <input id="btn-login" class="btn btn-success" type="submit" name="login_submit" value="로 그 인" />
                <input type="hidden" name="next" value={{ request.GET.next}} />
                <a id="btn-fblogin" href="{% url 'social:begin' backend='facebook' %}" class="btn btn-primary col-xs-12"><i class="icon-facebook"></i> 1초만에 페이스북으로 로그인 </a>
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-12 control">
            <div class="signup">
                아직 차차다방 회원이 아니세요? &nbsp
                <a href="#" id="signuplink"> 가입하기 </a>
            </div>
            <div class="forget">
                <a href="#"> 비밀번호를 잊어버리셨나요? </a>
            </div>
        </div>
    </div>
</form>

enter image description here

但是当我更改这样的模板时,当我输入错误的id或pw时,它不显示任何错误...

<form id="loginform" class="form-horizontal" role="form" method="post" action="{% url 'users:login' %}">
    {% csrf_token %}
    <div class="input-group">
        <span class="input-group-addon"><i class="icon-user"></i></span>
        <input id="id_username" type="text" class="form-control" name="username" value="" placeholder="username">
    </div>
    <div class="input-group">
        <span class="input-group-addon"><i class="icon-lock"></i></span>
        <input id="id_password" type="password" class="form-control" name="password" placeholder="password">
    </div>

    <div class="form-group">
        <!-- Button -->
        <div class="btn-controls">
            <div class="row">
                <input id="btn-login" class="btn btn-success" type="submit" name="login_submit" value="로 그 인" />
                <input type="hidden" name="next" value={{ request.GET.next}} />
                <a id="btn-fblogin" href="{% url 'social:begin' backend='facebook' %}" class="btn btn-primary col-xs-12"><i class="icon-facebook"></i> 1초만에 페이스북으로 로그인 </a>
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-12 control">
            <div class="signup">
                아직 차차다방 회원이 아니세요? &nbsp
                <a href="#" id="signuplink"> 가입하기 </a>
            </div>
            <div class="forget">
                <a href="#"> 비밀번호를 잊어버리셨나요? </a>
            </div>
        </div>
    </div>
</form>

即使我没有用户{{ form.xx }},如何让它显示错误消息?

这是我的LoginView

from django.utils.http import is_safe_url
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login
from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
from django.views.decorators.debug import sensitive_post_parameters
from django.views.generic import FormView

from users.forms import MyUserCreationForm


class LoginView(FormView):

    form_class = AuthenticationForm
    redirect_field_name = REDIRECT_FIELD_NAME

    # template_name is fake one.
    # This view only process POST request from users/login_signup.html
    template_name = "users/login_signup.html"

    @method_decorator(sensitive_post_parameters('password'))
    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        # Sets a test cookie to make sure the user has cookies enabled
        request.session.set_test_cookie()

        return super(LoginView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        auth_login(self.request, form.get_user())
        # If the test cookie worked, go ahead and
        # delete it since its no longer needed
        if self.request.session.test_cookie_worked():
            self.request.session.delete_test_cookie()

        return super(LoginView, self).form_valid(form)

    def get_context_data(self, *args, **kwargs):
        context = super(LoginView, self).get_context_data(*args, **kwargs)         
        return context

    def get_success_url(self):
        return self.request.POST.get("next")

1 个答案:

答案 0 :(得分:0)

我没有得到你的问题到底是什么,也不知道这是不是你的答案,但我只是说出来了!

应该使用您在模板中从视图传递的django表单,以便在提交表单后验证表单。

如果您关心的是如何以您想要的方式正确显示表单,那么它还有另一种解决方案。您可以按照您想要的方式表示表格,如下所示:

{% for field in form %} 
    <div class="input-group">
        {% if field.name=="username" %}
                <span class="input-group-addon"><i class="icon-user"></i></span>
                <input id="id_username" type="text" class="form-control" name="username" value="" placeholder="username">
        {% endif %}

        {% if field.name=="password" %}
                <span class="input-group-addon"><i class="icon-lock"></i></span>
                <input id="id_password" type="password" class="form-control" name="password" placeholder="password">
        {% endif %}

        {% for error in field.errors %}
               {{ error }}
        {% endfor %}
    </div>
{% endfor %}

如您所见,您可以通过field.errors访问字段错误,并使用field.name检查字段名称。

相关问题