如果用户未登录,我希望登录表单(来自django.contrib.auth的AuthenticationForm)出现在网站的每个页面上。当用户登录时,它们将被重定向到同一页面。如果有错误,该错误将与表格一起显示在同一页面上。
我想你需要一个上下文处理器来为每个模板提供表单。但是,那么你还需要每个视图来处理发布的表单吗?这是否意味着你需要创建一些中间件?我有点迷路了。
是否有接受的方法?
好的,我最终找到了一种方法,尽管我确信还有更好的方法。我创建了一个新的中间件类,称为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登录视图。