Domanda

Sto lavorando su un piccolo sito intranet per la piccola impresa, in cui l'utente dovrebbe essere in grado di pubblicare.Ho immaginato una molto semplice meccanismo di autenticazione dove la gente basta inserire il proprio indirizzo email, e viene inviato un unico url di login, che imposta un cookie che sarà sempre li identificano per le richieste future.

Nel mio modello di installazione, ho base.html e le altre pagine estendere questo.Voglio mostrare effettuato il login o registrarsi pulsante base.html ma come si può garantire che le necessarie variabili sono sempre una parte del contesto?Sembra che ogni visualizzazione imposta semplicemente il contesto, come a loro piace, e non c'è nessun contesto globale della popolazione.C'è un modo per farlo senza tra l'utente in ogni contesto di creazione?

O devo fare il mio collegamenti personalizzati di installazione il contesto in modo corretto?

È stato utile?

Soluzione

In un senso più generale di non dover impostare in modo esplicito le variabili in ogni vista, sembra che si desidera scrivere il proprio contesto processore.

Dal docs:

Un contesto processore ha un'interfaccia molto semplice:È solo una funzione Python che prende un argomento, un oggetto HttpRequest, e restituisce un dizionario che viene aggiunto al modello di contesto.Ogni contesto processore deve restituire un dizionario.

Altri suggerimenti

C'è nessun bisogno per scrivere un contesto processore per l'oggetto utente, se hai già le "django.core.context_processors.auth" in TEMPLATE_CONTEXT_PROCESSORS e se si sta utilizzando RequestContext nel vostro punto di vista.

se si utilizza django 1.4 o al più tardi il modulo è stato spostato django.contrib.auth.context_processors.auth

@Ryan:La documentazione su preprocessori è un po ' piccolo

@Staale:Aggiungere un utente ad un Contesto ogni volta che si chiama il modello a vista, SERVIZI

La soluzione è di usare un preprocessore

Un:Nelle impostazioni di aggiungere

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user',
)

B:In myapp/processor_file_name.py inserire

def user(request):
    if hasattr(request, 'user'):
        return {'user':request.user }
    return {}

Ora sei in grado di utilizzare oggetto utente funzionalità nel template.

{{ user.get_full_name }}

I suggerimenti sono in ogni risposta, ma ancora una volta, da "zero", per i neofiti:

dati di autenticazione in modelli (quasi) per impostazione predefinita -- con un piccolo trucco:

in views.py:

from django.template import RequestContext
...
def index(request):
    return render_to_response('index.html', 
                              {'var': 'value'},
                              context_instance=RequestContext(request))

in index.html:

...
Hi, {{ user.username }}
var: {{ value }}
... 

Da qui: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

Questo modello variabile di contesto non è disponibile se un RequestContext è non viene utilizzato.

@Dave Per utilizzare {{utente.nome utente}} nel mio template, io poi per l'uso requestcontext, piuttosto che solo una normale mappa/hash: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

Quindi credo che non ci sono globals che il motore di template controlli.

Ma RequestContext ha qualche precompilare le classi che posso guardare per risolvere i miei problemi.Grazie.

Se è possibile collegare il vostro autenticazione in Django schema di autenticazione sarete in grado di utilizzare request.user.

Credo che questo dovrebbe essere solo un caso di chiamata authenticate() e login() in base al contenuto del Cookie.

Edit:@Staale - io uso sempre il locals() trucco per il mio contesto, così tutti i miei modelli possono vedere request e così request.user.Se non siete, allora credo che non sarebbe così semplice.

il suo possibile per impostazione predefinita, effettuando le seguenti operazioni, assicurarsi di aver aggiunto il contesto di 'django.contrib.auth.context_processors.auth' nelle impostazioni.Per impostazione predefinita, il suo valore aggiunto in settings.py così per il suo aspetto simile a questo

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)

E si può accedere all'oggetto utente come questo,

{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}

Per ulteriori informazioni, fare riferimento qui http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top