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

Dlaczego Django nie dostarcza szablonu "registration/login.html" ?
TomDom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Białystok
  • Postów: 191
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

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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

Kopiuj
from django.contrib.auth.views import LoginView
TomDom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Białystok
  • Postów: 191
0

U mnie nie chce działać...

Tak wygląda mój settings.py

Kopiuj
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?

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

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

w views.py tworzysz sobie klasę

Kopiuj
Class Login(LoginView):
...

No i potem w urls w swojej apce w urlpatern

Kopiuj
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']

TomDom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Białystok
  • Postów: 191
0

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

Kopiuj
urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]
ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0
TomDom napisał(a):

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

Kopiuj
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ć.

TomDom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Białystok
  • Postów: 191
0

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

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

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

jedna linijka...

Dziwi mnie fakt, że trzeba tworzyć szablon.

Aby dodać Panel Admina wysztarczy dodać:

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

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

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

W Django ta jedna linijka kodu:

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

tworzy następujące widoki:

Kopiuj
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?
ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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:

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

jedna linijka...

Dziwi mnie fakt, że trzeba tworzyć szablon.

Aby dodać Panel Admina wysztarczy dodać:

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

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

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

W Django ta jedna linijka kodu:

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

tworzy następujące widoki:

Kopiuj
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:

Kopiuj
LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
TomDom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Białystok
  • Postów: 191
0
ledi12 napisał(a):

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

Kopiuj
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...

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.