web-dev-qa-db-fra.com

Comment utiliser la réinitialisation / modification du mot de passe intégré avec mes propres modèles

Par exemple, je peux pointer le url '^/accounts/password/reset/$' à Django.contrib.auth.views.password_reset avec le nom de 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 chaque réinitialisation de mot de passe et changer de vue.

91
Tom Viner

Si vous jetez un oeil aux sources de 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 b-liste a un bon introduction aux processeurs de contexte .

Edit (je semble avoir été confus quant à la nature de la question):

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

Vérifiez password_reset pour plus d'informations.

... ainsi, 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 URL correspondant à '/accounts/password/reset' avec le mot clé argument template_name = 'my_templates/password_reset.html'.

Sinon, vous n'avez pas besoin de fournir de contexte en tant que password_reset _ view prend soin de lui-même. Si vous voulez voir quel contexte vous avez disponible, vous pouvez déclencher une erreur TemplateSyntax et regarder à travers la trace de la pile pour trouver 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 voie à suivre.

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

99
Aaron Maenpaa

Je recommande vivement cet article.

Je viens de le brancher et cela a fonctionné

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

26
Alex Stewart

Il vous suffit d’envelopper les fonctions existantes et de transmettre le modèle souhaité. 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 le voir, jetez un coup d’œil à la déclinaison de fonction des vues intégrées:

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

10
jb.

Vous pouvez faire ce qui suit:

  1. ajouter à votre urlpatterns (r '^/comptes/mot de passe/reset/$', password_reset)
  2. placez votre modèle dans '/templates/registration/password_reset_form.html'
  3. faites que votre application vienne 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. Ainsi, 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 répéter pour aucune vue (définie par Django) le nom du modèle (ils sont déjà définis dans Django)
  2. Je veux une plus petite url.py
6
Lodato L

Une autre solution, peut-être plus simple, consiste à ajouter votre répertoire de modèles de remplacement à l'entrée DIRS du paramètre TEMPLATES dans settings.py. (Je pense que ce paramètre est nouveau dans Django 1.8. Il a peut-être été appelé TEMPLATE_DIRS dans les versions précédentes Django.)

Ainsi:

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

Ensuite, placez vos fichiers de modèle de remplacement sous my_app/templates. Ainsi, le modèle de réinitialisation du mot de passe remplacé serait my_app/templates/registration/password_reset_form.html

1
nmgeek

J'utilisais ces deux lignes dans l'URL et le modèle de l'administrateur ce que je changeais à mon besoin

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

Le documentation indique qu'il n'y a qu'une seule variable de contexte, form.

Si vous rencontrez des problèmes de connexion (ce qui est courant), documentation indique qu'il existe trois variables de contexte:

  • form: Un objet Form représentant le formulaire de connexion. Voir la documentation des formulaires pour plus d'informations sur les objets de formulaire.
  • next: l'URL à rediriger après une connexion réussie. Cela peut également contenir une chaîne de requête.
  • site_name: Nom du site actuel, conformément au paramètre SITE_ID.
1
S.Lott