Dlaczego Django nie dostarcza szablonu "registration/login.html" ?

0

Wczoraj straciłem kilka godzin starając się ustalić dlaczego Django nie może znaleźć szablonu.
Otrzymywałem następujący komunikat:

TemplateDoesNotExist at /accounts/login/
registration/login.html

Wszystko zrobiłem zgodnie z dokumentacją:

docs.djangoproject.com/en/4.0....using-the-views

W końcu udało mi się wyczytać na jakimś forum, że aby przykład podany w dokumentacji zadziałał trzeba:

  • stworzyć katalog templates/registration/
  • oraz stworzyć i umieścić w nim plik: login.html

Admin dostarcza szablon logowania, DRF również.

Czy mógłby ktoś wyjaśnić dlaczego rozwiązanie django.contrib.auth.urls nie dostarcza tego szablonu?

Pozdrawiam

1

Nie do końca rozumiem Twoje pytanie. Żeby template działało, trzeba określić jego ścieżkę w settings.py -> https://docs.djangoproject.com/en/4.0/topics/templates/#support-for-template-engines

A co do gotowego szablonu w django

from django.contrib.auth.views import LoginView
0

U mnie nie chce działać...

Tak wygląda mój settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Gdzie powinienem umieścić ten import?
from django.contrib.auth.views import LoginView

W urls.py czy w widokach?

0

Ten View to gotowy widok dla loginu tzn ma już wszystko wbudowane.

w views.py tworzysz sobie klasę

Class Login(LoginView):
...

No i potem w urls w swojej apce w urlpatern

from django.urls import path
from .views import Login

urlpatterns = [
    path('login', Login.as_view(), name="login"),
]

A co samych szablonów to brakuje Ci nazwy projektu w ścieżce, powinno być tak:
[BASE_DIR / 'nazwa_projektu/templates']

0

Szczerze mówiąc to ja mówiłem o zastosowaniu tego:

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]
0
TomDom napisał(a):

Szczerze mówiąc to ja mówiłem o zastosowaniu tego:

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]

Powyższe rozwiązanie wymusza na Tobie respektowanie defaultowych ustawień, czyli takie same nazwy templatek itp. urls właśnie korzystają z tego widoku co Ci wysłałem wyżej.

Lepiej sobie go zcustomizować.

0

Tu jest przykład
https://code.djangoproject.com/ticket/13061
I jest tu napisane:

plik login.html wystarczy, że będzie taki:

{% extends "admin/login.html" %}

jedna linijka...

Dziwi mnie fakt, że trzeba tworzyć szablon.

Aby dodać Panel Admina wysztarczy dodać:

urlpatterns = [
    path('admin/', admin.site.urls),
]

W DRF logowanie dodaje się za pomocą jednej linijki kodu:

urlpatterns = [
    path('api-auth/', include('rest_framework.urls')),
]

W Django ta jedna linijka kodu:

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]

tworzy następujące widoki:

accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']

Gdzie wszystkie pozostałe widoki oprócz login nie potrzebują dodatkowych szablonów.

Intuicyjnie spodziewam się, że dany szablon wygeneruje się automatycznie.

Zastanawia mnie czy:

  1. Jest jakiś powód dla którego trzeba stworzyć ręcznie app/templates/registration/login.html. Jaki?
  2. Czy to błąd lub niedopatrzenie Django?
  3. Czy może ten szablon powinien generować się automatycznie, tylko ja robię coś nie tak?
0
TomDom napisał(a):

Tu jest przykład
https://code.djangoproject.com/ticket/13061
I jest tu napisane:

plik login.html wystarczy, że będzie taki:

{% extends "admin/login.html" %}

jedna linijka...

Dziwi mnie fakt, że trzeba tworzyć szablon.

Aby dodać Panel Admina wysztarczy dodać:

urlpatterns = [
    path('admin/', admin.site.urls),
]

W DRF logowanie dodaje się za pomocą jednej linijki kodu:

urlpatterns = [
    path('api-auth/', include('rest_framework.urls')),
]

W Django ta jedna linijka kodu:

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]

tworzy następujące widoki:

accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']

Gdzie wszystkie pozostałe widoki oprócz login nie potrzebują dodatkowych szablonów.

Intuicyjnie spodziewam się, że dany szablon wygeneruje się automatycznie.

Zastanawia mnie czy:

  1. Jest jakiś powód dla którego trzeba stworzyć ręcznie app/templates/registration/login.html . Jaki?
  2. Czy to błąd lub niedopatrzenie Django?
  3. Czy może ten szablon powinien generować się automatycznie, tylko ja robię coś nie tak?

A spróbuj dodać w settings.py na dole:

LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
0
ledi12 napisał(a):

A spróbuj dodać w settings.py na dole:

LOGIN_URL = 'login'
LOGOUT_URL = 'logout'

Nie dziala.

https://docs.djangoproject.com/en/4.0/topics/auth/default/#built-in-auth-views

Jest tu napisane, że Django nie zapewnia templatki...

Django provides no default template for the authentication views. 
You should create your own templates for the views you want to use. 
The template context is documented in each view, see All authentication views.

1 użytkowników online, w tym zalogowanych: 0, gości: 1