1

Ich versuche Authentifizierungs- und Autorisierungssystem von Django zu verwenden, und wie ich die integrierten Standardansichten für Login/Logout erwarten Django-Vorlagen, daher kann ich meine Jinja2 base.html Datei nicht erweitern, da ich bereits Jinja2 integriert habe Motor.Wie kann man die Django-Authentifizierung mit Jinja2-Vorlagen richtig integrieren?

Ich konnte dieses Problem lösen, indem ich 'base.html' replizierte und die Syntax in die Django-Vorlage änderte, aber dieser Ansatz zwingt mich, auf zwei gleiche Dateien in verschiedenen Vorlagen zu setzen.

Allerdings habe ich ein anderes Problem, ich kann nicht auf das user Objekt in Jinja2 Vorlage context zugreifen, obwohl ich das in Django Vorlage tun kann.

Indem man sagt, 'ich nicht zugreifen kann':

File "/home/dir/workspace/project/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 430, in getattr return getattr(obj, attribute) 
UndefinedError: 'user' is undefined 

Meine Jinja2 Vorlage:

{% if user.is_authenticated %} 
    <li>User: {{ user.get_username }}</li> 
    <li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li> 
{% else %} 
    <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li> 
{% endif %} 

Meine Frage ist, wie kann ich dieses Problem gehen? Sollte ich nur Django-Vorlagen zurückschalten, weil das immer unordentlicher wird.

Antwort

2

Wenn Sie die Django-Vorlagensprache verwenden, können Sie {{ user }} verwenden, da der Auth-Kontextprozessor aktiviert ist. Jedoch using context processors with Jinja2 is discouraged.

Sie haben im Jinja2-Vorlagenkontext Zugriff auf request, sodass Sie auf request.user zugreifen können.

Supported in Django 1.10 and 1.11, required in Django 2.0+ 
{% if request.user.is_authenticated %} 

Beachten Sie, dass in Django < 1.10 user.is_authenticated() ein Verfahren ist, so dass Sie es in der Jinja2 Vorlage aufrufen müssen:

Required in Django < 1.10, supported in Django 1.10 and 1.11 
{% if request.user.is_authenticated() %} 
+0

Funktioniert wie ein Charme, nochmals danke @Alasdair! Ich hatte noch eine Frage, die eingebaute Django-Registrierung verwendet die Templates wie login.html/logged_out.html etc., ist es möglich sie mit meiner jinja base.html zu erweitern oder sollte ich eine eigene Django-Template Basis haben .html? –

+1

Sie können eine Django-Vorlage nicht mit einer Jinja-Vorlage erweitern oder umgekehrt. Ich würde versuchen, keine Basisvorlagen für Jinja und Django zu haben, das klingt nach unnötiger Duplizierung. Sie könnten Probleme haben, wenn Sie versuchen, die 'registration /' Templates mit Jinja Templates zu überschreiben, da diese auch vom Django Admin verwendet werden, der Django Templates verwendet. Sie könnten wahrscheinlich 'django-registration' und die eingebauten Authentifizierungsansichten so anpassen, dass sie auf Jinja2-Vorlagen zeigen. – Alasdair

1

Alasdair Antwort ist die beste! So betrachten ein Nachtrag: wenn Sie eine Menge von DTL-Vorlagen Jinja2 umwandelt und sie erstrecken sich alle von einer gemeinsamen Basis, sollten Sie in der Basisdatei etwas wie setzen:

{% if user is not defined %} 
    {% set user=request.user %} 
{% endif %} 

Dann werden Sie in der Lage um Ihre vorherigen Benutzervariablen problemlos zu verwenden.

Verwandte Themen