имя шаблона в LogoutView не работает на Python3.7 django2.1 - PullRequest
0 голосов
/ 04 сентября 2018

Ниже указано значение по умолчанию в django.contrib.auth.views.LogoutViews,

template_name = 'registration/logged_out.html'

Я настраиваю urls.py моего приложения так:

from django.urls import path
from . import views

from django.conf import settings

from django.contrib.auth.views import LoginView, LogoutView

app_name = 'account'
urlpatterns = [
    #path("login/", views.user_login, name="user_login"),
    path("login/", LoginView.as_view(), name="user_login"),
    path("nlogin/", LoginView.as_view(), {"template_name":"account/login.html"}),
    path("logout/", LogoutView.as_view(), name="user_logout"),
    path("logoutt/", LogoutView.as_view(), {"template_name":"account/logout.html"}),
]

«template_name»: «account / login.html» работает правильно, но «template_name»: «account / logout.html», кажется, не имеет значения, что не так с моим кодом?

Ответы [ 2 ]

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

В соответствии с советом Виллема Ван Онсема , я обнаружил, что ключевая проблема заключается в том, что я перепутал два пути urlpatterns, например:

  1. url () и тип регулярного выражения в urls.py (я узнал об этом в учебнике по django 1.10.1)

    from django.conf.urls import url
    from django.contrib.auth import views
    urlpatterns = [
        url(r"^login/$", views.login, {"template_name"="account/login.html"}, name='user_login'),
    ]
    
  2. путь () введите в urls.py (django 2.1 документы)

    from django.urls import path
    from django.contrib.auth.views import LoginView
    urlpatterns = [
        path("login/", LoginView.as_view(template_name="account/login.html"),name="user_login"),
    ]
    

Очевидно, что следует отметить два основных различия:

  1. импорт URL из django.conf.urls, но импорт путей из django.urls прямо, а тип пути появился в django 2.0, путь кажется более простым
  2. в django 2.1 настройки LoginView и LogoutView передают as_view (), сравните со старым выражением views.login, {"template_name" = "account / login.html"} , тоже проще
0 голосов
/ 04 сентября 2018

При использовании варианта на основе классов *1002* настройки передаются в представление с помощью метода .as_view (так называемый **initkwargs):

from django.urls import path
from . import views

from django.conf import settings

from django.contrib.auth.views import LoginView, LogoutView

app_name = 'account'

urlpatterns = [
    #path("login/", views.user_login, name="user_login"),
    path("login/", LoginView.as_view(), name="user_login"),
    path("nlogin/", LoginView.as_view<b>(template_name='account/login.html')</b>),
    path("logout/", LogoutView.as_view(), name="user_logout"),
    path("logoutt/", LogoutView.as_view<b>(template_name='account/logout.html')</b>),
]

В противном случае параметры окажутся в self.kwargs, и представление на основе классов не проверяет их.

В документации к LoginView [Django-doc] упоминается это, а также список параметров, которые вы можете передать как **initkwargs.

...