Zawsze włączaj użytkownika w kontekst szablonu django
Pracuję nad małym intranetem dla małej firmy, gdzie użytkownik powinien móc publikować posty. Wyobraziłem sobie bardzo prosty mechanizm uwierzytelniania, w którym ludzie po prostu wprowadzają swój adres e-mail i otrzymują unikalny adres URL logowania, który ustawia plik cookie, który zawsze identyfikuje ich dla przyszłych żądań.
W mojej konfiguracji szablonu mam bazę.html, a pozostałe strony rozszerzają to. Chcę pokazać przycisk zalogowany lub Zarejestruj się w bazie.html, ale jak Mogę zapewnić, że niezbędne zmienne są zawsze częścią kontekstu? Wydaje się, że każdy Widok po prostu ustawia kontekst tak, jak chcą, i nie ma globalnej populacji kontekstu. Czy istnieje sposób, aby to zrobić bez włączania użytkownika w każdym tworzeniu kontekstu?
Czy będę musiał zrobić własne niestandardowe skróty, aby poprawnie skonfigurować kontekst?
7 answers
W bardziej ogólnym sensie, że nie trzeba jawnie ustawiać zmiennych w każdym widoku, wygląda na to, że chcesz spojrzeć na pisanie własnego procesora kontekstowego .
From the docs:
Procesor kontekstowy ma bardzo prosty interfejs: jest to tylko funkcja Pythona, która pobiera jeden argument, obiekt HttpRequest i zwraca słownik, który jest dodawany do kontekstu szablonu. Każdy procesor kontekstowy musi zwrócić słownik.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 12:31:58
There is no need to write a context processor for the user object if you already have the "django.core.context_processors.auth"
W TEMPLATE_CONTEXT_PROCESSORS
i Jeśli używasz RequestContext
w Twoich poglądach.
Jeśli używasz django 1.4 lub najnowszego, moduł został przeniesiony do django.contrib.auth.context_processors.auth
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-28 14:28:43
@Ryan: dokumentacja o preprocesorach jest trochę mała
@Staale: Dodawanie użytkownika do kontekstu za każdym razem, gdy wywołuje się szablon w widoku, DRY
Rozwiązaniem jest użycie preprocesora
A : w Ustawieniach dodaj
TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
)
B : W myapp/processor_file_name.py insert
def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {}
Od teraz możesz korzystać z funkcjonalności obiektów użytkownika w swoich szablonach.
{{ user.get_full_name }}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:01:21
Podpowiedzi są w każdej odpowiedzi, ale po raz kolejny, od "zera", dla początkujących:
Dane uwierzytelniające są domyślnie w szablonach (prawie) -- z małą sztuczką:
W views.py
:
from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request))
W index.html
:
...
Hi, {{ user.username }}
var: {{ value }}
...
Stąd: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
Ta zmienna kontekstowa szablonu nie jest dostępna, jeśli RequestContext jest nie jest używany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-09 07:28:58
@ Dave Aby użyć {{user.username}} w moich szablonach, będę musiał użyć requestcontext zamiast zwykłej mapy/hash: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
Więc chyba nie ma żadnych globali, które silnik szablonu sprawdza.
Ale RequestContext ma kilka wstępnie wypełnionych klas, które mogę sprawdzić, aby rozwiązać moje problemy. Dzięki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 12:33:31
Jeśli możesz podłączyć swoje uwierzytelnianie do schemat uwierzytelniania Django będziesz mógł użyć request.user
.
Myślę, że powinno to być tylko przypadek wywołania authenticate()
i login()
w oparciu o zawartość Twojego pliku Cookie.
locals()
trick dla mojego kontekstu, aby wszystkie Moje szablony widziały request
i tak request.user
. Jeśli nie, to chyba nie byłoby to takie proste.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 12:46:08
Jest to możliwe domyślnie, wykonując następujące kroki, upewnij się, że dodałeś kontekst ' django.contrib.auth.context_processors.auth ' w Ustawieniach. Domyślnie dodane w settings.py, więc wygląda tak
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)
I możesz uzyskać dostęp do obiektu użytkownika w ten sposób,
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
Aby uzyskać więcej informacji, zobacz tutaj http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 11:15:12