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?

Author: Staale, 2008-09-03

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.

 18
Author: Ryan Duffield,
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

 43
Author: Daniel,
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 }}
 33
Author: zalun,
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.

 3
Author: iutinvg,
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.

 2
Author: Staale,
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.

Edit: @ Staale - zawsze używam 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.
 2
Author: Dave Webb,
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

 1
Author: Anto Binish Kaspar,
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