【问题标题】:Trouble with Django Logout Page, django-registration logout.html Template Form FieldsDjango 注销页面出现问题,django-registration logout.html 模板表单字段
【发布时间】:2013-12-26 17:06:55
【问题描述】:

我正在使用django-registration。让它工作后,我继续使用 Bootstrap 扩展视图和表单以进行字段自定义。

除注销页面外,我对所有内容都有此功能。在默认方法中,我只是从头开始构建表单,它工作正常。但是当尝试使用 Django 的表单时,它根本没有显示字段。登录和注销模板都使用这种基本形式:

<div class="auth-form">
    <form class="form-signin" method="post" action="/accounts/login/">
        {% csrf_token %}
        <h2 class="form-signin-heading">Please log in</h2>
            <div class="font-16px top-mar-1em">
                <label for="id_username"></label>
                {{ form.username }}
                <label for="id_password1"></label>
                {{ form.password }}
                <div class="form-group">
                    <div class="col-sm-10">
                        <div class="level-checkbox">
                            <label for="checkbox">
                                {{ form.remember_me }} Remember me
                            </label>
                        </div>
                    </div>
                </div>
                <button class="btn btn-primary" type="submit">Log in</button>
        </div>
    </form>
</div>

这适用于登录页面,但对于注销页面则不行(缺少字段)。就像此页面无法使用表单一样。我确定我错过了一些简单的东西,但我无法弄清楚。

我的urls.py 部分如下所示:

url(r'^accounts/login/$','django.contrib.auth.views.login', {
    'template_name': 'registration/login.html',
    'authentication_form': UserAuthenticationForm,
}),

我尝试向urls.py 添加一个注销部分,类似于登录部分,但没有奏效。我试过使用logout_then_login,在logout.html 上使用login.html 作为导入模板和其他杂项都无济于事。

显然,没有与默认注销视图关联的表单,所以这可能是问题所在,但我不确定在注销视图中实现标准表单的最佳方式。

【问题讨论】:

  • 您使用什么视图来生成注销页面?
  • 到目前为止,默认视图...我扩展了AuthenticationView 以进行登录,但是当我将相同的视图传递给urls.py 时,它会引发错误。这确实感觉我可能遗漏了一些东西,但我不确定如何实现它。
  • 默认的 Django 注销视图没有任何关联的表单。我是否正确,因为您想要注销用户,然后让他们再次重定向到登录表单?
  • 是的,这是正确的,但是使用不同的模板,logout.html,所以我可以向用户显示消息。我没有意识到默认视图没有与之关联的任何表单。那么,这很可能是我的问题。最好的方法是什么?我尝试将我为登录视图/页面创建的扩展表单作为参数传递给urls.py,但它抛出了一个错误......

标签: django django-registration form-fields


【解决方案1】:

您应该能够将以下内容添加到您的 urls.py 并让一切正常。

url(r'^accounts/logout/$','django.contrib.auth.views.logout_then_login')

确保您已将LOGIN_URL 定义为您的settings.py。然后,当用户单击注销链接时,他们将点击注销视图,该视图负责重定向到包含您的表单的登录视图。

【讨论】:

  • 感谢您的回答。已经尝试过这个,但不是我需要的(在我的 OP 中提到)......我希望用户登陆 logout.html 页面,该页面包含与 login.html 文件中相同的表单。它包含一些html,显示一条消息,例如“您已被注销”。如果我可以让消息显示在login.html 页面上,我也许可以使用logout_then_login 视图。
  • 这是什么信息?是不是像“您已注销”?因为您可以为此使用消息框架。
  • 我还是 Django 的新手,所以我不知道这种东西的所有酷技巧。我确定我一心一意地试图强制注销视图/表单的想法。也许将logout_then_login 与消息框架一起使用是一个更好的选择。谢谢。
【解决方案2】:

感谢@tsurantino,我能够使用消息框架来完成这项工作。我总是喜欢使用我以前没有使用过的 Django 的一部分来实现一个新功能。可以这么说,添加到工具包中。这是我所做的:

因为我已经有一个 signal_connectors.py 文件用于根据用户注册/激活发送电子邮件,所以我刚刚添加到它:

@receiver(user_logged_out)
def user_logged_out_message(sender, request, **kwargs):
    messages.add_message(
        request,
        messages.INFO,
        'You\'ve been successfully logged out. You can log in again below.'
)

然后在我的common 应用程序的__init__.py 中导入它:

from common.signal_connectors import user_logged_out_message

然后在我的login.html 模板中:

{% if messages %}
    <div class="alert-success align-ctr font-16px top-mar-2em">
        {% for message in messages %}
            {{ message }}
        {% endfor %}
    </div>
{% endif %}

最后,注销后重定向到登录页面(urls.py):

url(r'^accounts/logout/$','django.contrib.auth.views.logout_then_login'),

感谢大家的帮助和cmets。

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 2014-03-01
    • 2016-09-18
    • 1970-01-01
    • 2011-01-05
    • 2018-04-26
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多