Skip to main content
 首页 » 编程设计

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

2025年05月04日36soundcode

我正在尝试使用 Django 提供的身份验证和授权系统,因为我可以看到登录/注销的默认内置 View 需要 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 模板,因为它变得越来越困惑。

请您参考如下方法:

当您使用 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 < 1.10 中,user.is_authenticated() 是一个方法,因此您必须在 Jinja2 模板中调用它:

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