【问题标题】:Adding extra_context in Django logout built-in view在 Django 注销内置视图中添加 extra_context
【发布时间】:2011-10-09 01:57:04
【问题描述】:

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 ),

它有效,但随后我收到“已注销”文本...

谢谢, 弗雷德

【问题讨论】:

    标签: django django-views logout django-authentication


    【解决方案1】:

    当您编写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 并传入您想要的任何参数——这通常是您在更复杂的情况下“扩展”基于函数的通用视图的方式。

    【讨论】:

    • 你好,我有同样的问题,我有 url(r'^accounts/logout/$', logout, {'extra_context':{'myvar':'hello World'}}),但是当我尝试在模板中做 {{ myvar }} 它是空的
    【解决方案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'}
    )),
    

    这里要突出显示的代码 sn-p 是 .as_view() 函数。 Django 2.0 将身份验证视图实现为类。您可以在Authentication Views documentation

    中阅读更多相关信息

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

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

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

    在这里您可以看到可以传递给 LogoutView 和其他身份验证视图类的其他类属性。

    【讨论】:

      【解决方案3】:

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

      1. 创建自定义 mixin(希望这或多或少是 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 开始就不需要了),但至少它可以工作。

      【讨论】:

        猜你喜欢
        • 2013-02-15
        • 2012-08-02
        • 2013-11-11
        • 2013-07-07
        • 2011-04-18
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多