【问题标题】:How to integrate Django authentication with Jinja2 templates properly?如何将 Django 身份验证与 Jinja2 模板正确集成?
【发布时间】:2018-04-14 19:21:49
【问题描述】:

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

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

但是,现在我有其他问题,我无法访问 Jinja2 模板 context 中的 user 对象,即使我可以在 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 模板,因为这变得越来越混乱。

【问题讨论】:

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


    【解决方案1】:

    当您使用 Django 模板语言时,您可以使用{{ user }},因为启用了身份验证上下文处理器。不过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 user.is_authenticated() 是一个方法,因此您必须在 Jinja2 模板中调用它:

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

    【讨论】:

    • 像魅力一样工作,再次感谢@Alasdair!我还有一个问题,所以内置的 django-registration 使用了 login.html/logged_out.html 等模板,是否可以用我的 jinja base.html 扩展它们,或者我应该有一个单独的 django-template 库.html?
    • 您不能使用 Jinja 模板扩展 Django 模板,反之亦然。我会尽量避免使用 Jinja 和 Django 的基本模板,这听起来像是不必要的重复。如果您尝试使用 Jinja 模板覆盖 registration/ 模板,您可能会遇到问题,因为使用 Django 模板的 Django 管理员也使用它们。您可能可以自定义 django-registration 和内置的身份验证视图以指向 Jinja2 模板。
    【解决方案2】:

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

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

    然后您就可以毫无问题地使用之前的用户变量了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2012-04-06
      • 2017-03-16
      • 1970-01-01
      • 2015-08-05
      相关资源
      最近更新 更多