Django消息仅在使用form | crispy时起作用,而在其他情况下则不起作用

问题描述

我正在使用django创建登录页面,但是当我输入错误的密码或电子邮件地址时,它不显示任何消息。我还检查了其他消息,但没有帮助。

login.html

    <div class="right">
        <h2>Login</h2>

        {% if messages %}
            {% for message in messages %}
              <div class="alert alert-{{ message.tags }}">
                  {{ message }}
              </div>
            {% endfor %}
        {% endif %}
    
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <div class="field">
                    <div class="label">Email or Username</div>
                    <input type="text" name="username" id="username" class="form-control">
                </div>
                <div class="field">
                    <div class="label">Password</div>
                    <input type="password" name="password" id="password" class="form-control">
                </div>
                <button class="login" type="submit">LOGIN</button>
            </fieldset>
        </form>
        <div class="sign_up">
            <small>Don’t have an account yet?</small>
            <a class="signup" href="{% url 'register' %}">SIGN UP</a>
        </div>
    </div>

urls.py具有登录页面的此路径(我已经导入了所有必需的类):

path('login/',auth_views.LoginView.as_view(template_name='users/login.html'),name='login'),

但是当我在login.html中使用此form|crispy时会显示这些消息

        <div class="content-section">
            <form method="POST">
                {% csrf_token %}
                <fieldset class="form-group">
                    <legend class="border-bottom mb-4">Login</legend>
                    {{ form|crispy }}
                </fieldset>
                <div class="form-group">
                    <button class="btn btn-outline-info" type="submit">Sign In</button>
                </div>
            </form>
            <div class="border-top pt-3">
                <small class="muted-text">
                    Want a new Account? <a class="ml-1" href="{% url 'register' %}">Sign Up</a>
                </small>
            </div>
        </div>

解决方法

您在这里使用 LoginView 并使用了表单,由于{{ form|crispy }}模板标签呈现 form ,它会返回并显示错误 fields ,以及 field.errors field.non_field_error

这就是为什么如果删除代码中的 message 块会收到一条错误消息的原因,它将向您显示错误,并且登录视图中的表单和消息没有任何联系

如果要使用CSS呈现HTML表单,则需要显式定义错误显示此类块的错误

 <div class="right">
        <h2>Login</h2>

       {% if form.errors %}

        {% for field in form %}
           {% for error in field.errors %}
              <div class="alert alert-danger">
                  <strong>{{ error|escape }}</strong>
              </div>
           {% endfor %}
        {% endfor %}

           {% for error in form.non_field_errors %}
              <div class="alert alert-danger">
                 <strong>{{ error|escape }}</strong>
              </div>
           {% endfor %}
        {% endif %}

        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <div class="field">
                    <div class="label">Email or Username</div>
                    <input type="text" name="username" id="username" class="form-control">
                </div>
                <div class="field">
                    <div class="label">Password</div>
                    <input type="password" name="password" id="password" class="form-control">
                </div>
                <button class="login" type="submit">LOGIN</button>
            </fieldset>
        </form>
        <div class="sign_up">
            <small>Don’t have an account yet?</small>
            <a class="signup" href="{% url 'register' %}">SIGN UP</a>
        </div>
    </div>

这并不意味着使用Django的消息框架。在表单的errors属性中将其自身返回错误 希望您对此答案感到满意