在Django logout内置视图中添加extra_context

时间:2011-07-20 04:35:40

标签: django django-views logout django-authentication

django/contrib/auth/views.py中有退出视图的定义:

def logout(request, next_page=None,
       template_name='registration/logged_out.html',
       redirect_field_name=REDIRECT_FIELD_NAME,
       current_app=None, extra_context=None):

我想添加extra_context以摆脱我注销时出现的'已注销'标题

所以我在我的网址中尝试这个:

(r'^accounts/logout/$', logout(extra_context={'title':'something else'}) ),

但后来我收到此错误:logout()至少需要1个非关键字参数(给定0) 我做错了什么? PS: 当我做的时候

(r'^accounts/logout/$', logout ),

它有效,但后来我收到了'退出'文字......

谢谢, 佛瑞德

3 个答案:

答案 0 :(得分:11)

当您编写logout(extra_context={'title':'something else'})时,您实际上正在URLconf中调用logout,这将无效。 Any URLconf tuple can have an optional third element, which should be a dictionary of extra keyword arguments to pass to the view function

(r'^accounts/logout/$', logout, {'extra_context':{'title':'something else'}}),

或者,您可以编写自己的视图,调用logout传递您想要的任何参数 - 这通常是在更复杂的情况下“扩展”基于函数的通用视图的方式。

答案 1 :(得分:2)

将django 2.0的发现添加为此线程的上一个答案不再适用于最新的django版本。

使用2.0,将URL添加到urls.py文件的正确方法是使用path():

from django.urls import path
from django.contrib.auth import views as auth_views

path('accounts/logout/', auth_views.LogoutView.as_view(
  extra_context={'foo':'bar'}
)),

此处突出显示的代码段是.as_view()函数。 Django 2.0将auth视图实现为类。您可以在Authentication Views documentation

中详细了解相关信息

然后"转换"使用`.as_view()的视图类,您可以将源代码中定义的任何类属性作为命名参数传递。

传入extra_context(默认为None)会自动将这些上下文变量公开给模板。

您可以按照以下python路径访问LogoutView的源代码:django.contrib.auth.views

在这里,您可以看到可以传递给LogoutView的其他类属性以及其他auth视图类。

答案 2 :(得分:0)

在django 1.11中,标题和通用视图也有类似的问题(尽管问题主要是我没有从2.0版本切换到文档版本)。我想通过extra_context将标题传递给从CreateView继承的视图,并发现django的通用视图没有这样的属性。所以,这是我的拐杖:

  1. 创建自定义混合(希望或多或少是2.0中ContextMixin的作用):

    class ExtraContextMixin():
        extra_context = {}
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context.update(self.extra_context)
    
            return context
    
  2. 添加mixin到视图的祖先(这是我必须更改的所有代码):

    class CustomView(ExtraContextMixin, CreateView):
    
  3. 通过url传递extra_context:

    url(r'^custom-view/$', views.CustomView.as_view(extra_context={'title': 'just any'}), name='custom-view')
    

不幸的是,我不知道这样的解决方案是否可以接受(显然从2.0开始就不需要了),但是至少它是可行的。

相关问题