Na przykład mogę wskazać url '^/accounts/password/reset/$'
do django.contrib.auth.views.password_reset
z nazwą pliku szablonu w kontekście, ale myślę, że muszę wysłać więcej szczegółów kontekstu.
Muszę dokładnie wiedzieć, jaki kontekst dodać dla każdego resetowania hasła i zmiany widoków.
context
jest to właściwe rozwiązanie!Odpowiedzi:
Jeśli spojrzysz na źródła dla django.contrib.auth.views.password_reset , zobaczysz, że używa
RequestContext
. W rezultacie możesz użyć procesorów kontekstu, aby zmodyfikować kontekst, co może pozwolić na wstrzyknięcie potrzebnych informacji.Lista b ma dobre wprowadzenie do procesorów kontekstu .
Edytuj (wydaje mi się, że byłem zdezorientowany, jakie było rzeczywiste pytanie):
Zauważysz, że
password_reset
przyjmuje nazwany parametr o nazwietemplate_name
:def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', password_reset_form=PasswordResetForm, token_generator=default_token_generator, post_reset_redirect=None):
Sprawdź password_reset, aby uzyskać więcej informacji.
... a więc z urls.py jak:
from django.conf.urls.defaults import * from django.contrib.auth.views import password_reset urlpatterns = patterns('', (r'^/accounts/password/reset/$', password_reset, {'template_name': 'my_templates/password_reset.html'}), ... )
django.contrib.auth.views.password_reset
będzie wywoływana w przypadku adresów URL pasujących'/accounts/password/reset'
do argumentu słowa kluczowegotemplate_name = 'my_templates/password_reset.html'
.W przeciwnym razie nie musisz podawać żadnego kontekstu, ponieważ
password_reset
widok sam się o siebie troszczy. Jeśli chcesz zobaczyć, jaki kontekst masz dostępny, możesz wywołaćTemplateSyntax
błąd i przejrzeć ślad stosu, aby znaleźć ramkę z lokalną zmienną o nazwiecontext
. Jeśli chcesz zmodyfikować kontekst, to prawdopodobnie najlepsze jest to, co powiedziałem powyżej o procesorach kontekstu.Podsumowując: co musisz zrobić, aby użyć własnego szablonu? Podaj
template_name
argument słowa kluczowego do widoku, gdy jest on wywoływany. Możesz dostarczać argumenty słów kluczowych do widoków, dołączając słownik jako trzeci element członkowski krotki wzorca adresu URL.źródło
registration/password_reset_email.html
faktycznie zawierać elementy HTML, takich jak:<div>
,<a>
bo to wysyła tylko tekstGorąco polecam ten artykuł.
Po prostu go podłączyłem i zadziałało
http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html
źródło
Wystarczy opakować istniejące funkcje i przekazać żądany szablon. Na przykład:
from django.contrib.auth.views import password_reset def my_password_reset(request, template_name='path/to/my/template'): return password_reset(request, template_name)
Aby to zobaczyć, spójrz na deklarację funkcji wbudowanych widoków:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74
źródło
Możesz wykonać następujące czynności:
Wyjaśnienie:
Kiedy szablony są ładowane, są przeszukiwane w zmiennej INSTALLED_APPS w settings.py. Kolejność jest podyktowana rangą definicji w INSTALLED_APPS, więc ponieważ Twoja aplikacja znajduje się przed 'django.contrib.auth', Twój szablon został załadowany (odnośnik: https://docs.djangoproject.com/en/dev/ref/templates/api /#django.template.loaders.app_directories.Loader ).
Motywacja podejścia:
źródło
Innym, być może prostszym rozwiązaniem jest dodanie katalogu nadpisań szablonów do wpisu DIRS w ustawieniu TEMPLATES w settings.py. (Myślę, że to ustawienie jest nowe w Django 1.8. Mogło nazywać się TEMPLATE_DIRS w poprzednich wersjach Django).
Tak jak to:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # allow overriding templates from other installed apps 'DIRS': ['my_app/templates'], 'APP_DIRS': True, }]
Następnie umieść pliki szablonów nadpisań pod
my_app/templates
. Więc zastąpiony szablon resetowania hasła byłbymy_app/templates/registration/password_reset_form.html
źródło
Dokumentacja mówi, że istnieje tylko jedna zmienna kontekstowego
form
.Jeśli masz problemy z logowaniem (co jest częste), dokumentacja mówi, że istnieją trzy zmienne kontekstowe:
form
: Obiekt Form reprezentujący formularz logowania. Zobacz dokumentację formularzy, aby uzyskać więcej informacji na temat obiektów Form.next
: Adres URL do przekierowania po pomyślnym zalogowaniu. Może również zawierać ciąg zapytania.site_name
: Nazwa bieżącej witryny, zgodnie z ustawieniem SITE_ID.źródło
password_reset
poglądu.Używałem tych dwóch linii w adresie URL i szablonie od administratora, co zmieniałem według moich potrzeb
url(r'^change-password/$', 'django.contrib.auth.views.password_change', { 'template_name': 'password_change_form.html'}, name="password-change"), url(r'^change-password-done/$', 'django.contrib.auth.views.password_change_done', { 'template_name': 'password_change_done.html' }, name="password-change-done")
źródło