Come si usa la reimpostazione della password / le visualizzazioni di modifica con i miei modelli


92

Ad esempio, posso puntare url '^/accounts/password/reset/$'a django.contrib.auth.views.password_resetcon il nome del file del mio modello nel contesto, ma penso sia necessario inviare più dettagli sul contesto.

Ho bisogno di sapere esattamente quale contesto aggiungere per ciascuna delle reimpostazioni della password e delle modifiche alle visualizzazioni.


1
Visto il titolo di questa domanda non credo contextsia la cosa giusta che stai cercando!
jb.

2
Giusto per confermare, per "contesto" intendevo il dizionario di dati extra che è il terzo argomento di una riga url. aka dati extra o kwargs . Ci scusiamo per la confusione, modifica la domanda, chiunque può.
Tom Viner

Risposte:


100

Se dai un'occhiata ai sorgenti per django.contrib.auth.views.password_reset vedrai che usa RequestContext. Il risultato è che puoi utilizzare i processori di contesto per modificare il contesto che potrebbe consentire di iniettare le informazioni di cui hai bisogno.

La b-list ha una buona introduzione ai processori di contesto .

Modifica (mi sembra di essere stato confuso su quale fosse la vera domanda):

Noterai che password_resetaccetta un parametro denominato chiamato 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):

Controlla password_reset per ulteriori informazioni.

... quindi, con un urls.py come:

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_resetverrà chiamato per gli URL che corrispondono '/accounts/password/reset'all'argomento della parola chiave template_name = 'my_templates/password_reset.html'.

In caso contrario, non è necessario fornire alcun contesto poiché la password_resetvista si prende cura di se stessa. Se vuoi vedere quale contesto hai a disposizione, puoi attivare un TemplateSyntaxerrore e guardare attraverso la traccia dello stack trovare il frame con una variabile locale denominata context. Se vuoi modificare il contesto, quello che ho detto sopra sui processori di contesto è probabilmente la strada da percorrere.

In sintesi: cosa devi fare per utilizzare il tuo modello? Fornire un template_nameargomento parola chiave alla vista quando viene chiamata. È possibile fornire argomenti di parole chiave alle viste includendo un dizionario come terzo membro di una tupla di pattern URL.


Credo che la domanda riguardi l'uso di modelli diversi con viste incorporate: i processori di contesto non ne tengono conto!
jb.

6
qualsiasi idea, come lasciare registration/password_reset_email.htmlin realtà contenere elementi HTML come: <div>, <a>perché questo invia solo testo
mabdrabo

@mabdrabo - dai un'occhiata a questo articolo su come far funzionare l'HTML.
gregoltsov

26

Consiglio vivamente questo articolo.

L'ho appena collegato e ha funzionato

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


2
ottimo collegamento, grazie. per coloro che seguono il collegamento - django-registration ora include le viste di autenticazione predefinite ... quindi tutto ciò che devi fare è creare i modelli dettagliati nel collegamento sopra. inoltre - usa django-crispy-forms se vuoi evitare tutto il lavoro manuale sui moduli html che ha fatto anche lui.
dougvk

C'è del codice Django legacy che devo gestire al lavoro, ma so a malapena qualcosa del framework. Quel ragazzo mi ha salvato il culo! Ottimo tutorial
Matt Vukas

Grazie per il collegamento! Penso che questa dovrebbe essere la risposta accettata poiché, come hai detto, l'ho collegata e ha funzionato.
ihatecache

10

Hai solo bisogno di racchiudere le funzioni esistenti e passare il modello che desideri. Per esempio:

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)

Per vedere questo basta dare un'occhiata alla funzione declartion delle viste integrate:

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


2
Non è il modo più semplice per farlo. Puoi passare un dizionario come terza parte di una tupla di pattern URL o, se ritieni di dover davvero racchiudere la funzione, puoi usare: password_reset = functools.partial (password, template_name = "path / to / my / template" )
Aaron Maenpaa

7

Puoi fare quanto segue:

  1. aggiungi ai tuoi schemi url (r '^ / accounts / password / reset / $', password_reset)
  2. inserisci il tuo modello in "/templates/registration/password_reset_form.html"
  3. fai in modo che la tua app venga prima di "django.contrib.auth" in INSTALLED_APPS

Spiegazione:

Quando i modelli vengono caricati, vengono cercati nella variabile INSTALLED_APPS in settings.py. L'ordine è dettato dal rango della definizione in INSTALLED_APPS, quindi poiché la tua app viene prima di 'django.contrib.auth' il tuo modello è stato caricato (riferimento: https://docs.djangoproject.com/en/dev/ref/templates/api /#django.template.loaders.app_directories.Loader ).

Motivazione dell'approccio:

  1. Voglio essere più asciutto e non ripetere per nessuna vista (definita da django) il nome del modello (sono già definiti in django)
  2. Voglio un url.py più piccolo

2

Un'altra soluzione, forse più semplice, è aggiungere la directory del modello di sostituzione alla voce DIRS dell'impostazione TEMPLATES in settings.py. (Penso che questa impostazione sia nuova in Django 1.8. Potrebbe essere stata chiamata TEMPLATE_DIRS nelle versioni precedenti di Django.)

Così:

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

Quindi metti i tuoi file modello di sostituzione sotto my_app/templates. Quindi il modello di reimpostazione della password sovrascritto sarebbemy_app/templates/registration/password_reset_form.html


1

La documentazione dice che c'è una sola variabile di contesto, form.

Se hai problemi con il login (che è comune), la documentazione dice che ci sono tre variabili di contesto:

  • form: Un oggetto Form che rappresenta il form di login. Vedere la documentazione dei moduli per ulteriori informazioni sugli oggetti modulo.
  • next: L'URL a cui reindirizzare dopo aver effettuato correttamente l'accesso. Può contenere anche una stringa di query.
  • site_name: Il nome del sito corrente, in base all'impostazione SITE_ID.

2
La documentazione dice che c'è un "argomento opzionale" chiamato "template_name" che sembra più rilevante.
jb.

L'argomento facoltativo è un argomento della funzione, non un contesto fornito al modulo.
S.Lott

Mmm- Penso che la domanda sia fonte di confusione in quanto parla di "contesto" quando in realtà tutto ciò che è rilevante per risolvere questo problema sono gli argomenti della password_resetvista.
jb.

1

Stavo usando queste due righe nell'URL e nel modello dell'amministratore cosa stavo cambiando in base alle mie esigenze

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.