91 votes

Comment utiliser les vues intégrées de réinitialisation/changement de mot de passe avec mes propres modèles ?

Par exemple, je peux pointer le url '^/accounts/password/reset/$' a django.contrib.auth.views.password_reset avec le nom du fichier de mon modèle dans le contexte mais je pense qu'il faut envoyer plus de détails sur le contexte.

J'ai besoin de savoir exactement quel contexte ajouter pour chacune des vues de réinitialisation et de modification du mot de passe.

99voto

Aaron Maenpaa Points 39173

Si vous jetez un coup d'oeil aux sources pour django.contrib.auth.views.password_reset vous verrez qu'il utilise RequestContext . Le résultat est que vous pouvez utiliser les processeurs de contexte pour modifier le contexte, ce qui peut vous permettre d'injecter les informations dont vous avez besoin.

La liste B a une bonne introduction aux processeurs de contexte .

Edit (il semble que j'ai été confus quant à la question réelle) :

Vous remarquerez que password_reset prend un paramètre nommé appelé 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):

... donc, avec un urls.py comme :

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 sera appelé pour les URLs correspondant à '/accounts/password/reset' avec l'argument mot-clé template_name = 'my_templates/password_reset.html' .

Sinon, vous n'avez pas besoin de fournir de contexte car l'option password_reset La vue s'occupe d'elle-même. Si vous voulez voir quel contexte vous avez à disposition, vous pouvez déclencher un TemplateSyntax et regardez dans la trace de la pile, trouvez le cadre avec une variable locale nommée context . Si vous voulez modifier le contexte, ce que j'ai dit plus haut à propos des processeurs de contexte est probablement la solution.

En résumé : que devez-vous faire pour utiliser votre propre modèle ? Fournir un template_name argument du mot-clé à la vue lorsqu'elle est appelée. Vous pouvez fournir des arguments de mots-clés aux vues en incluant un dictionnaire comme troisième membre d'un tuple de motif d'URL.

26voto

Alex Stewart Points 135

Je recommande vivement cet article.

Je l'ai juste branché et ça a marché

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

10voto

jb. Points 4883

Il vous suffit d'envelopper les fonctions existantes et de passer le modèle que vous souhaitez. Par exemple :

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)

Pour s'en convaincre, il suffit de regarder la déclaration de fonction des vues intégrées :

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

7voto

Lodato L Points 41

Vous pouvez procéder comme suit :

  1. ajouter à vos urlpatterns (r'^/accounts/password/reset/$', password_reset)
  2. mettez votre modèle dans '/templates/registration/password_reset_form.html'.
  3. faire en sorte que votre application soit placée avant 'django.contrib.auth' dans INSTALLED_APPS

Explication :

Lorsque les modèles sont chargés, ils sont recherchés dans votre variable INSTALLED_APPS dans settings.py . L'ordre est dicté par le rang de la définition dans INSTALLED_APPS, donc puisque votre application est antérieure à 'django.contrib.auth', votre modèle a été chargé (référence : https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader ).

Motivation de l'approche :

  1. Je veux être plus sec et ne pas répéter pour chaque vue (définie par django) le nom du modèle (ils sont déjà définis dans django).
  2. Je veux un plus petit url.py

1voto

S.Lott Points 207588

El documentation dit qu'il n'y a qu'une seule variable de contexte, form .

Si vous rencontrez des difficultés pour vous connecter (ce qui est courant), la fonction documentation dit qu'il y a trois variables de contexte :

  • form : Un objet Form représentant le formulaire de connexion. Voir la documentation sur les formulaires pour plus d'informations sur les objets Form.
  • next : L'URL à rediriger après une connexion réussie. Elle peut également contenir une chaîne de requête.
  • site_name : Le nom du site actuel, selon le paramètre SITE_ID.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X