it-swarm.com.de

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

Zum Beispiel kann ich das url '^/accounts/password/reset/$' bis Django.contrib.auth.views.password_reset mit meinem Vorlagendateinamen im Kontext, aber ich denke, müssen mehr Kontextdetails senden.

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

91
Tom Viner

Wenn Sie sich die Quellen für Django.contrib.auth.views.password_reset ansehen, werden Sie feststellen, dass RequestContext verwendet wird. Das Fazit ist, dass Sie mit Kontextprozessoren den Kontext ändern können, mit dem Sie möglicherweise die benötigten Informationen einfügen können.

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

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

Sie werden feststellen, dass password_reset Einen benannten Parameter namens template_name Akzeptiert:

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

Andernfalls müssen Sie keinen Kontext angeben, da sich die Ansicht password_reset Um sich selbst kümmert. Wenn Sie sehen möchten, über welchen Kontext Sie verfügen, können Sie einen TemplateSyntax -Fehler auslösen und im Stack-Trace nach dem Frame mit der lokalen Variablen context suchen. 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? Stellen Sie der Ansicht beim Aufruf ein Schlüsselwortargument template_name Zur Verfügung. Sie können Schlüsselwortargumente für Ansichten bereitstellen, indem Sie ein Wörterbuch als drittes Mitglied eines URL-Mustertupels einfügen.

99
Aaron Maenpaa

Diesen Artikel wärmstens empfehlen.

Ich habe es nur eingesteckt und es hat funktioniert

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

26
Alex Stewart

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)

Schauen Sie sich dazu einfach die Funktionsdeklaration der eingebauten Views an:

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

10
jb.

Sie können Folgendes tun:

  1. füge deinen urlpattern hinzu (r '^/accounts/password/reset/$', password_reset)
  2. fügen Sie Ihre Vorlage in "/templates/registration/password_reset_form.html" ein.
  3. stellen Sie Ihre App in INSTALLED_APPS vor 'Django.contrib.auth'

Erläuterung:

Wenn die Vorlagen geladen werden, werden sie in Ihrer INSTALLED_APPS-Variablen in settings.py gesucht. Die Reihenfolge richtet sich nach dem Rang der Definition in INSTALLED_APPS. Da Ihre App also vor "Django.contrib.auth" steht, wurde Ihre Vorlage geladen (Referenz: https://docs.djangoproject.com/en/dev/ref /templates/api/#Django.template.loaders.app_directories.Loader ).

Motivation des Ansatzes:

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

Eine andere, vielleicht einfachere Lösung besteht darin, Ihr Überschreibungsvorlagenverzeichnis zum DIRS-Eintrag der TEMPLATES-Einstellung in settings.py hinzuzufügen. (Ich denke, diese Einstellung ist neu in Django 1.8. Möglicherweise wurde sie in früheren Django) -Versionen 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,
}]

Stellen Sie dann Ihre Überschreibungsvorlagendateien unter my_app/templates. Die überschriebene Vorlage zum Zurücksetzen des Passworts wäre also my_app/templates/registration/password_reset_form.html

1
nmgeek

Ich benutzte diese zwei Zeilen in der URL und der Vorlage vom Administrator, was ich an meine Bedürfnisse änderte

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

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

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

  • form: Ein Formularobjekt, das das Anmeldeformular darstellt. Weitere Informationen zu Formularobjekten finden Sie in der Dokumentation zu Formularen.
  • next: Die URL, zu der nach erfolgreicher Anmeldung weitergeleitet werden soll. Dies kann auch eine Abfragezeichenfolge enthalten.
  • site_name: Der Name der aktuellen Site gemäß der Einstellung von SITE_ID.
1
S.Lott