当前位置:  开发笔记 > 编程语言 > 正文

在每个页面上放置一个django登录表单

如何解决《在每个页面上放置一个django登录表单》经验,为你挑选了3个好方法。

如果用户未登录,我希望登录表单(来自django.contrib.auth的AuthenticationForm)显示在我站点的每个页面上.当用户登录时,它们将被重定向到同一页面.如果出现错误,则错误将显示在与表单相同的页面上.

我想你需要一个上下文处理器来为每个模板提供表单.但是,那么你还需要每个视图来处理发布的表单吗?这是否意味着您需要创建一些中间件?我有点迷茫.

这是否有可接受的方式?



1> asciitaxi..:

好吧,我最终找到了一种方法,虽然我确信有更好的方法.我创建了一个名为LoginFormMiddleware的新中间件类.在process_request方法中,或多或少地按照auth登录视图的方式处理表单:

class LoginFormMiddleware(object):

    def process_request(self, request):

        # if the top login form has been posted
        if request.method == 'POST' and 'is_top_login_form' in request.POST:

            # validate the form
            form = AuthenticationForm(data=request.POST)
            if form.is_valid():

                # log the user in
                from django.contrib.auth import login
                login(request, form.get_user())

                # if this is the logout page, then redirect to /
                # so we don't get logged out just after logging in
                if '/account/logout/' in request.get_full_path():
                    return HttpResponseRedirect('/')

        else:
            form = AuthenticationForm(request)

        # attach the form to the request so it can be accessed within the templates
        request.login_form = form

现在,如果您安装了请求上下文处理器,则可以使用以下命令访问该表单:

{{ request.login_form }}

请注意,隐藏字段"is_top_login_form"已添加到表单中,因此我可以将其与页面上的其他已发布表单区分开来.此外,表单操作是"." 而不是auth登录视图.


Django表单采用[`prefix`](https://docs.djangoproject.com/en/dev/ref/forms/api/#prefixes-for-forms)参数,您可以使用而不是隐藏字段.例如`form = AuthenticationForm(prefix ="login",data = request.POST)`.

2> twampss..:

使用django.contrib.auth,您可以将表单代码放在基本模板中,如下所示:

{% csrf_token %}

您需要做的就是修改下一个值,而不是:


它现在将是:


要访问请求对象,请确保包括

'django.core.context_processors.request'

在模板上下文处理器中.这样,您就不必为登录编写任何上下文处理器,因为您使用的是Django内置视图.


对不起,完全忘了这个问题.谢谢你的解决方案.我不知道"下一个"领域.如果表单有效,则完美无缺.我现在的问题是如何处理错误.基本上我想返回"下一个"视图,但在上下文中使用登录表单.

3> John Debs..:

最简单的方法可能是将表单手动放在基本模板中,如下所示:

{% if user.is_authenticated %}
    
{% csrf_token %}
{% else %} {# display something else here... #} {% endif %}

然后只需编写一个连接到名为"login"的URL的视图来处理正常的表单(使用与上述表单匹配的表单对象).让视图重定向以request.META['HTTP_REFERER']在与提交的页面相同的页面上显示它.

这种方法避免了中间件或需要通过上下文使表单可用于每个模板.

更新:这种方法存在一些问题; 需要多考虑一下.希望它至少能让你朝着正确的方向前进.


如果您使用的是最新版本的trunk,并且您要发布到通常处理登录的django.contrib.auth视图,那么您的表单应包含`{%csrf_token%}`.
`{{form.errors}}`,`{{form.non_field_errors}}`和`{{form. .errors}}`
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有