Inkludert alltid brukeren i Django malen sammenheng

stemmer
28

Jeg jobber på en liten intranettområde for et lite selskap, hvor brukeren skal kunne legge. Jeg har forestilt en veldig enkel autentiseringsmekanisme der folk bare å skrive inn e-postadressen din, og blir sendt et unikt påloggings url, som setter en cookie som alltid vil identifisere dem for fremtidige forespørsler.

I min mal oppsett, jeg har base.html, og de andre sidene forlenge denne. Jeg ønsker å vise logget inn eller registrer knappen i base.html, men hvordan kan jeg sørge for at de nødvendige variablene er alltid en del av konteksten? Det virker som hver visning bare setter opp sammenheng som de vil, og det er ingen global sammenheng befolkningen. Er det en måte å gjøre dette uten å inkludere brukeren i hver sammenheng skapelsen?

Eller må jeg lage mine egne snarveier for å sette sammenhengen riktig?

Publisert på 03/09/2008 klokken 12:22
kilden bruker
På andre språk...                            


7 svar

stemmer
43

Det er ikke nødvendig å skrive en kontekst prosessor for brukerobjektet hvis du allerede har "django.core.context_processors.auth"i og hvis du bruker i dine synspunkter.TEMPLATE_CONTEXT_PROCESSORS RequestContext

hvis du bruker Django 1.4 eller siste modulen har blitt flyttet til django.contrib.auth.context_processors.auth

Svarte 30/06/2009 kl. 16:14
kilden bruker

stemmer
33

@Ryan: Dokumentasjon om preprocessors er litt lite

@Staale: Legge brukeren til Context hver gang man ringer malen i sikte, TØRR

Løsningen er å bruke en preprosessor

A : I innstillingene legge

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

B : I MinApp / processor_file_name.py innsats

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

Fra nå av er du i stand til å bruke brukerobjekt funksjoner i malene dine.

{{ user.get_full_name }}
Svarte 06/11/2008 kl. 16:05
kilden bruker

stemmer
18

I en mer generell følelse av ikke å eksplisitt sette variabler i hver visning, det høres ut som du ønsker å se på å skrive din egen kontekst prosessor .

Fra docs:

En sammenheng prosessor har et veldig enkelt grensesnitt: Det er bare en Python-funksjon som tar ett argument, en HttpRequest objekt, og returnerer en ordbok som blir lagt til malen sammenheng. Hver sammenheng prosessor må returnere en ordbok.

Svarte 03/09/2008 kl. 12:31
kilden bruker

stemmer
3

Tipsene er i alle svar, men nok en gang, fra "scratch", for nybegynnere:

autentisering data er i maler (nesten) som standard - med et lite triks:

i views.py:

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

i index.html:

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

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

Denne malen sammenheng variabelen er ikke tilgjengelig hvis en RequestContext ikke er i bruk.

Svarte 09/08/2012 kl. 07:28
kilden bruker

stemmer
2

@Dave å bruke {{user.username}} i mine maler, jeg vil da måtte bruke RequestContext snarere enn bare en vanlig kart / hash: http://www.djangoproject.com/documentation/templates_python/#subclassing-context- RequestContext

Så jeg antar det er ingen globals at malen motorkontroller.

Men RequestContext har noen prepopulate klasser som jeg kan se inn for å løse mine problemer. Takk.

Svarte 03/09/2008 kl. 12:33
kilden bruker

stemmer
2

Hvis du kan koble din godkjenning i Django godkjenningsskjemaet vil du være i stand til å bruke request.user.

Jeg tror dette bør bare være et tilfelle av ringer authenticate()og login()basert på innholdet i Cookie.

Edit: @Staale - Jeg har alltid bruke locals()triks for min sammenheng, slik at alle mine maler kan se requestog så request.user. Hvis du ikke er så tror jeg det ville ikke være så enkelt.

Svarte 03/09/2008 kl. 12:28
kilden bruker

stemmer
1

det er mulig som standard, ved å gjøre følgende trinn, at du har lagt sammenheng 'django.contrib.auth.context_processors.auth' i innstillingene. Som standard dets lagt i settings.py, så de ser ut som dette

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

Og du kan få tilgang til brukerobjekt som dette,

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

For mer informasjon, se her http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

Svarte 27/01/2011 kl. 11:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more