如何正确地将Django身份验证与Jinja2模板集成?

时间:2017-11-02 10:01:33

标签: python django django-templates jinja2 django-authentication

我正在尝试使用Django提供的身份验证和授权系统,因为我可以看到登录/注销的默认内置视图需要Django模板,因此我无法使用我的Jinja2 base.html文件将它们扩展为我已经集成了Jinja2引擎。

我能够通过复制' base.html'来解决这个问题。并将语法更改为Django模板,但这种方法迫使我依赖于两个不同模板语言的相同文件。

但是,现在我有其他问题,我无法访问Jinja2模板user中的context对象,即使我可以在Django模板中执行此操作。

说'我无法访问':

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 

我的Jinja2模板:

{% 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 %}

我的问题是,我该如何解决这个问题?我应该切换回Django模板,因为这会变得越来越混乱。

2 个答案:

答案 0 :(得分:4)

使用Django模板语言时,可以使用{{ user }},因为启用了auth上下文处理器。但是using context processors with Jinja2 is discouraged

您可以访问Jinja2模板上下文中的request,因此您可以访问request.user

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

请注意,在Django&lt; 1.10,user.is_authenticated()是一种方法,因此您必须在Jinja2模板中调用它:

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

答案 1 :(得分:1)

Alasdair的答案是最好的!因此,请考虑这是一个附录:如果您将大量DTL模板转换为Jinja2,并且它们都从一个公共基础扩展,请考虑在基本文件中添加如下内容:

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

然后,您将能够毫无问题地使用您之前的用户变量。