Altyd insluitend die gebruiker in die Django sjabloon konteks
-
09-06-2019 - |
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?
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