Добавление extra_context во встроенном представлении выхода из Django - PullRequest
7 голосов
/ 20 июля 2011

В 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, чтобы избавиться от заголовка 'Logged out', который появляется при выходе из системы

так что я пытаюсь это сделать в своем URL-адресе:

* * 1010

но тогда я получаю эту ошибку: logout () принимает как минимум 1 аргумент без ключевого слова (задано 0) что я делаю не так? пс: когда я

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

это работает, но потом я получаю текст 'Logged out' ...

Спасибо, Фред

Ответы [ 3 ]

11 голосов
/ 20 июля 2011

Когда вы пишете logout(extra_context={'title':'something else'}), вы на самом деле звоните logout прямо в URLconf, что не будет работать. Любой кортеж URLconf может иметь необязательный третий элемент, который должен быть словарем дополнительных аргументов ключевого слова для передачи в функцию представления .

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

В качестве альтернативы, вы можете написать свое собственное представление, которое вызывает logout, передавая любые аргументы, которые вы хотите - как правило, вы бы «расширили» основанные на функциях общие представления в более сложных случаях.

2 голосов
/ 10 марта 2018

Добавление моих выводов для 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 реализует представления авторизации как классы. Вы можете прочитать больше об этом в Документациях Authentication Views

Затем вы «конвертируете» класс в представление, используя `.as_view (), и вы можете передавать любые атрибуты класса, определенные в исходном коде как именованные параметры.

Передача extra_context (по умолчанию None) автоматически предоставляет эти контекстные переменные вашим шаблонам.

Вы можете получить доступ к исходному коду для LogoutView, следуя этому пути к Python: django.contrib.auth.views

Здесь вы можете увидеть другие атрибуты класса, которые вы можете передать в LogoutView и другие классы представления auth.

0 голосов
/ 07 сентября 2018

У меня была похожая проблема с заголовками и общими представлениями в django 1.11 (хотя проблема была в основном в том, что я не переключал версию документа с 2.0).Я хотел передать заголовок через extra_context представлению, унаследованному от CreateView, и обнаружил, что универсальное представление django не имеет такого атрибута.Итак, вот мои костыли:

  1. Создание собственного миксина (надеюсь, это более или менее то, что делает 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. Передать extra_context из URL:

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

К сожалению, я понятия не имею, является ли такое решение приемлемым (очевидно, нет необходимости с 2.0), но, по крайней мере, оно работает.

...