Vra

Ek is besig met 'n klein intranet site vir 'n klein maatskappy, waar gebruikers moet in staat wees om te post. Ek het 'n baie eenvoudige verifikasie meganisme waar mense net voer hul e-pos adres gedink, en kry gestuur 'n unieke login url, wat 'n koekie wat hulle altyd sal identifiseer vir toekomstige versoeke stel.

In my sjabloon setup, het ek base.html, en die ander bladsye uit te brei hierdie. Ek wil aangemeld wys of knoppie registreer in die base.html, maar hoe kan ek verseker dat die nodige veranderlikes is altyd 'n deel van die konteks? Dit blyk dat elke oog net sit die konteks as wat hulle wil, en daar is geen globale konteks bevolking. Is daar 'n manier om dit te doen sonder om die gebruiker in elke konteks skepping?

Of sal ek my eie persoonlike kortpaaie te maak vir die opstel van die konteks behoorlik?

Was dit nuttig?

Oplossing

In 'n meer algemene sin van nie hoef te uitdruklik gestel veranderlikes in elke oog, dit klink asof jy wil om te kyk na die skryf van jou eie konteks verwerker .

Van die dokumente:

  

'n konteks verwerker het 'n baie eenvoudige koppelvlak: Dit is net 'n Python funksie wat een argument, 'n HttpRequest voorwerp neem, en gee 'n woordeboek wat kry by die sjabloon konteks. Elke konteks verwerker moet 'n woordeboek om terug te keer.

Ander wenke

Daar is nie nodig om 'n konteks verwerker vir die gebruiker voorwerp skryf as jy reeds die "django.core.context_processors.auth" in TEMPLATE_CONTEXT_PROCESSORS en as jy die gebruik van RequestContext in jou mening.

As jy met behulp van Django 1.4 of jongste die module is verskuif na django.contrib.auth.context_processors.auth

@Ryan: Dokumentasie oor preprocessors is 'n bietjie klein

@Staale: gebruiker Voeg by die konteks elke keer as een roep die sjabloon in die lig, droë

oplossing is om 'n voorverwerker gebruik

A : In jou stellings voeg

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

B : In myapp / processor_file_name.py voeg

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

Van nou af sal jy in staat wees om gebruiker voorwerp funksies te gebruik in jou templates is.

{{ user.get_full_name }}

Die wenke is in elke antwoord, maar weereens, van "kras", vir beginners:

verifikasie data is in templates (byna) by verstek - met 'n klein truuk:

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 }}
... 

Van hier: https: // dokumente. djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

  

Hierdie sjabloon konteks veranderlike is nie beskikbaar indien a RequestContext is   nie gebruik word nie.

@Dave Om te gebruik {{user.username}} in my templates, ek sal dan gebruik requestcontext eerder as net 'n gewone kaart / hash: http: //www.djangoproject com / dokumentasie / templates_python / # subclassing-konteks-requestcontext

So ek dink daar is geen globals dat die sjabloon enjin tjeks.

Maar die RequestContext het 'n paar vul vooraf klasse wat ek kan kyk na my probleme op te los. Dankie.

As jy jou verifikasie kan haak in die Django verifikasie skema wat jy sal in staat wees om request.user gebruik.

Ek dink dit moet net 'n geval van 'n beroep authenticate() en login() gebaseer op die inhoud van jou koekie wees.

Edit: @Staale - Ek gebruik altyd die locals() mislei vir my konteks so al my templates kan request en so request.user sien. As jy nie dan dink ek dit sou nie so eenvoudig nie.

sy moontlik by verstek, deur die volgende te doen stappe, verseker jy het die konteks 'django.contrib.auth.context_processors.auth' in jou stellings bygevoeg. By verstek sy bygevoeg in settings.py, sodat sy lyk soos volg

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

En kan jy toegang tot die gebruiker voorwerp soos hierdie,

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

Vir meer inligting, verwys hier http: / /docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top