Wie verwende ich die integrierten Ansichten zum Zurücksetzen / Ändern von Passwörtern mit meinen eigenen Vorlagen?

92

Zum Beispiel kann ich mit meinem Vorlagendateinamen auf den im Kontext verweisen url '^/accounts/password/reset/$', django.contrib.auth.views.password_resetaber ich denke, ich muss mehr Kontextdetails senden.

Ich muss genau wissen, welchen Kontext ich für jedes Zurücksetzen des Passworts und Ändern der Ansichten hinzufügen muss.

Tom Viner
quelle
1
Angesichts des Titels dieser Frage denke ich nicht, dass contextes das Richtige ist, wonach Sie suchen!
jb.
2
Nur um zu bestätigen, meinte ich mit "Kontext" das Wörterbuch der zusätzlichen Daten, das das dritte Argument für eine URL-Zeile ist. aka zusätzliche Daten oder kwargs . Entschuldigung für die Verwirrung, bitte bearbeiten Sie die Frage, jeder, der kann.
Tom Viner

Antworten:

100

Wenn Sie sich die Quellen für django.contrib.auth.views.password_reset ansehen, werden Sie feststellen , dass es verwendet wird RequestContext. Das Ergebnis ist, dass Sie Kontextprozessoren verwenden können, um den Kontext zu ändern, sodass Sie möglicherweise die benötigten Informationen einfügen können.

Die B-Liste bietet eine gute Einführung in Kontextprozessoren .

Bearbeiten (Ich bin anscheinend verwirrt darüber, was die eigentliche Frage war):

Sie werden feststellen, dass password_resetein benannter Parameter namens template_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):

Überprüfen Sie password_reset auf weitere Informationen.

... also mit einer urls.py wie:

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_resetwird für URLs aufgerufen, die '/accounts/password/reset'mit dem Schlüsselwortargument übereinstimmen template_name = 'my_templates/password_reset.html'.

Andernfalls müssen Sie keinen Kontext angeben, da sich die password_resetAnsicht um sich selbst kümmert. Wenn Sie sehen möchten, welchen Kontext Sie zur Verfügung haben, können Sie einen TemplateSyntaxFehler auslösen und durch die Stapelverfolgung den Frame mit einer lokalen Variablen namens suchen context. Wenn Sie den Kontext ändern möchten, ist das, was ich oben über Kontextprozessoren gesagt habe, wahrscheinlich der richtige Weg.

Zusammenfassend: Was müssen Sie tun, um Ihre eigene Vorlage zu verwenden? Geben Sie template_nameder Ansicht beim Aufruf ein Schlüsselwortargument an. Sie können Ansichten Schlüsselwortargumente bereitstellen, indem Sie ein Wörterbuch als drittes Mitglied eines URL-Mustertupels einfügen.

Aaron Maenpaa
quelle
Ich glaube, die Frage betrifft die Verwendung verschiedener Vorlagen mit integrierten Ansichten - Kontextprozessoren berücksichtigen dies nicht!
jb.
6
Jede Idee, wie man registration/password_reset_email.htmltatsächlich HTML-Elemente wie: enthält <div>, <a>weil dies nur Text sendet
mabdrabo
@mabdrabo - In diesem Artikel erfahren Sie, wie Sie HTML zum Laufen bringen.
Gregoltsov
26

Ich kann diesen Artikel nur empfehlen.

Ich habe es einfach angeschlossen und es hat funktioniert

http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html

Alex Stewart
quelle
2
toller Link, danke. Für diejenigen, die dem Link folgen - die Django-Registrierung enthält jetzt die Standardauthentifizierungsansichten. Sie müssen also nur die im obigen Link beschriebenen Vorlagen erstellen. Verwenden Sie auch Django-Crispy-Formulare, wenn Sie die manuelle HTML-Schalung vermeiden möchten, die er ebenfalls ausgeführt hat.
Dougvk
Es gibt einen alten Django-Code, den ich bei der Arbeit verwalten muss, aber ich weiß kaum etwas über das Framework. Dieser Typ hat meinen Arsch gerettet! Tolles Tutorial
Matt Vukas
Danke für den Link! Ich denke, dies sollte die akzeptierte Antwort sein, da sie, wie Sie sagten, eingesteckt und funktioniert hat.
Ihatecache
10

Sie müssen nur die vorhandenen Funktionen umbrechen und die gewünschte Vorlage übergeben. Beispielsweise:

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)

Um dies zu sehen, werfen Sie einen Blick auf die Funktionsdeklaration der eingebauten Ansichten:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74

jb.
quelle
2
Nicht der einfachste Weg, das zu tun. Sie können ein Wörterbuch als dritten Teil eines URL-Mustertupels übergeben. Wenn Sie der Meinung sind, dass Sie die Funktion wirklich umbrechen müssen, können Sie Folgendes verwenden: password_reset = functools.partial (password, template_name = "path / to / my / template" )
Aaron Maenpaa
7

Sie können Folgendes tun:

  1. zu deinen URL-Mustern hinzufügen (r '^ / accounts / password / reset / $', password_reset)
  2. Fügen Sie Ihre Vorlage in '/templates/registration/password_reset_form.html' ein.
  3. Stellen Sie sicher, dass Ihre App in INSTALLED_APPS vor 'django.contrib.auth' steht

Erläuterung:

Wenn die Vorlagen geladen werden, werden sie in Ihrer Variablen INSTALLED_APPS in settings.py durchsucht. Die Reihenfolge wird durch den Rang der Definition in INSTALLED_APPS bestimmt. Da Ihre App also vor 'django.contrib.auth' steht, wurde Ihre Vorlage geladen (Referenz: https://docs.djangoproject.com/de/dev/ref/templates/api) /#django.template.loaders.app_directories.Loader ).

Motivation des Ansatzes:

  1. Ich möchte trockener sein und den Vorlagennamen (sie sind bereits in Django definiert) für keine Ansicht (definiert durch Django) wiederholen.
  2. Ich möchte eine kleinste url.py.
Lodato L.
quelle
2

Eine andere, vielleicht einfachere Lösung besteht darin, Ihr Überschreibungsvorlagenverzeichnis zum DIRS-Eintrag der Einstellung TEMPLATES in settings.py hinzuzufügen. (Ich denke, diese Einstellung ist neu in Django 1.8. In früheren Django-Versionen wurde sie möglicherweise TEMPLATE_DIRS genannt.)

Wie so:

TEMPLATES = [
   {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # allow overriding templates from other installed apps                                                                                                
        'DIRS': ['my_app/templates'],
        'APP_DIRS': True,
}]

Dann legen Sie Ihre Override-Vorlagendateien unter my_app/templates. Die überschriebene Vorlage zum Zurücksetzen des Passworts wäre alsomy_app/templates/registration/password_reset_form.html

nmgeek
quelle
1

Die Dokumentation besagt, dass es nur eine Kontextvariable gibt form.

Wenn Sie Probleme mit der Anmeldung haben (was häufig vorkommt), gibt es in der Dokumentation drei Kontextvariablen:

  • form: Ein Formularobjekt, das das Anmeldeformular darstellt. Weitere Informationen zu Formularobjekten finden Sie in der Formulardokumentation.
  • next: Die URL, zu der nach erfolgreicher Anmeldung umgeleitet werden soll. Dies kann auch eine Abfragezeichenfolge enthalten.
  • site_name: Der Name der aktuellen Site gemäß der Einstellung SITE_ID.
S.Lott
quelle
2
Die Dokumentation besagt, dass es ein "optionales Argument" namens "Vorlagenname" gibt, das relevanter erscheint.
jb.
Das optionale Argument ist ein Argument für die Funktion und kein Kontext für das Formular.
S.Lott
Mmmm - Ich denke, die Frage ist insofern verwirrend, als sie über "Kontext" spricht, wenn wirklich alles, was für die Lösung dieses Problems relevant ist, die Argumente der password_resetAnsicht sind.
jb.
1

Ich habe diese beiden Zeilen in der URL und der Vorlage des Administrators verwendet, was ich an meine Bedürfnisse angepasst habe

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")
Azd325
quelle