Adding extra_context in Django logout built-in view

前端 未结 3 1788
情书的邮戳
情书的邮戳 2020-12-19 05:56

In django/contrib/auth/views.py there is the definition of the logout view :

def logout(request, next_page=None,
       template_name=\'registration/logged_o         


        
相关标签:
3条回答
  • 2020-12-19 06:43

    When you write logout(extra_context={'title':'something else'}), you're actually calling logout right there in the URLconf, which won't work. 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'}}),
    

    Alternatively, you could write your own view which calls logout passing in whatever arguments you want -- that's typically how you would "extend" function-based generic views in more complicated cases.

    0 讨论(0)
  • 2020-12-19 07:01

    Adding my findings for django 2.0 as the previous answer on this thread no longer works for the most recent django version.

    With 2.0, the proper way of adding a URL to your urls.py file is by using 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'}
    )),
    

    The code snippet to highlight here is the .as_view() function. Django 2.0 implements auth views as classes. You can read more about this in the Authentication Views documentation

    You then "convert" the class to a view using `.as_view() and you are able to pass in any class attributes defined in the source code as named parameters.

    Passing in extra_context (which defaults to None) automatically exposes these context variables to your templates.

    You can access the source code for LogoutView by following this python path: django.contrib.auth.views

    Here you can see the other class attributes you can pass into LogoutView and the other auth view classes.

    0 讨论(0)
  • 2020-12-19 07:01

    I had a similar problem with titles and generic views in django 1.11 (though the problem was mostly that I didn't switch docs version from 2.0). I wanted to pass title via extra_context to the view inherited from CreateView, and discovered that django's generic view had no such attribute. So, here are my crutches:

    1. Create custom mixin (hope that's more or less what ContextMixin in 2.0 does):

      class ExtraContextMixin():
          extra_context = {}
      
          def get_context_data(self, **kwargs):
              context = super().get_context_data(**kwargs)
              context.update(self.extra_context)
      
              return context
      
    2. Add mixin to view's ancestors (that's all code I had to change):

      class CustomView(ExtraContextMixin, CreateView):
      
    3. Pass extra_context from url:

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

    Unfortunately, I have no idea whether such solution is acceptable (no need since 2.0, obviously), but at least it's working.

    0 讨论(0)
提交回复
热议问题