在Django logout内置视图中添加extra_context



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以摆脱当我注销时出现的"注销"标题

所以我尝试在我的url confs:

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

但随后我得到这个错误:logout()至少需要1个非关键字参数(给定0)我做错了什么?ps:当我做

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

它工作,但然后我得到'登出'文本…

谢谢,弗雷德

当你写logout(extra_context={'title':'something else'})时,你实际上是在URLconf中调用logout,这是行不通的。任何URLconf都可以有可选的第三个元素,它应该是传递给视图函数的额外关键字参数的字典。

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

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

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

在2.0中,向URL .py文件添加URL的正确方法是使用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将认证视图作为类实现。您可以在Authentication Views文档 中了解更多信息。

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

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

可以通过以下python路径访问LogoutView的源代码:django.contrib.auth.views

在这里你可以看到你可以传递给LogoutView和其他认证视图类的其他类属性。

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

  1. 创建自定义mixin(希望这或多或少是ContextMixin在2.0中所做的):

    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以来不需要),但至少它正在工作

最新更新