Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Django身份验证与Jinja2模板正确集成?_Python_Django_Django Templates_Jinja2_Django Authentication - Fatal编程技术网

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

Python 如何将Django身份验证与Jinja2模板正确集成?,python,django,django-templates,jinja2,django-authentication,Python,Django,Django Templates,Jinja2,Django Authentication,我正在尝试使用Django提供的身份验证和授权系统,因为我可以看到登录/注销的默认内置视图,Django模板除外,因此我无法使用我的Jinja2base.html文件来扩展它们,因为我已经集成了Jinja2引擎 我可以通过复制“base.html”并将语法更改为Django模板来解决这个问题,但这种方法迫使我依赖两个不同模板语言的相同文件 但是,现在我遇到了另一个问题,我无法访问Jinja2模板上下文中的user对象,即使我可以在Django模板中这样做 通过说“我无法访问”: File "/h

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

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

但是,现在我遇到了另一个问题,我无法访问Jinja2模板
上下文
中的
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 %}
Required in Django < 1.10, supported in Django 1.10 and 1.11
{% if request.user.is_authenticated() %}
{%if user.u经过身份验证%}
  • 用户:{{User.get_username}
  • {%else%}
  • {%endif%}

    我的问题是,我怎样才能绕过这个问题?我是否应该切换回Django模板,因为这会变得越来越混乱。

    当您使用Django模板语言时,您可以使用
    {{user}}
    ,因为auth上下文处理器已启用。不过

    您可以在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\u authenticated()
    是一个方法,因此必须在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 %}
    
    Required in Django < 1.10, supported in Django 1.10 and 1.11
    {% if request.user.is_authenticated() %}
    
    Django<1.10中需要
    ,Django 1.10和1.11中支持
    {%if request.user.is_authenticated()%}
    
    当您使用Django模板语言时,您可以使用
    {{user}}
    ,因为auth上下文处理器已启用。不过

    您可以在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\u authenticated()
    是一个方法,因此必须在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 %}
    
    Required in Django < 1.10, supported in Django 1.10 and 1.11
    {% if request.user.is_authenticated() %}
    
    Django<1.10中需要
    ,Django 1.10和1.11中支持
    {%if request.user.is_authenticated()%}
    
    阿拉斯代尔的答案是最好的!因此,考虑这是一个附录:如果你将许多DTL模板转换成JICAN2,并且它们都从一个公共基础扩展,考虑把基本文件放进类似的文件:

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

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

    阿拉斯代尔的答案是最好的!因此,考虑这是一个附录:如果你将许多DTL模板转换成JICAN2,并且它们都从一个公共基础扩展,考虑把基本文件放进类似的文件:

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

    这样,您就可以毫无问题地使用以前的用户变量。

    非常有效,再次感谢@Alasdair!我还有一个问题,所以内置的django注册使用了login.html/logged_out.html等模板,是否可以用我的jinja base.html扩展它们,或者我应该有一个单独的django template base.html?你不能用jinja模板扩展django模板,反之亦然。我会尽量避免使用Jinja和Django的基本模板,这听起来像是不必要的重复。如果试图用Jinja模板覆盖
    注册/
    模板,则可能会出现问题,因为使用Django模板的Django管理员也会使用这些模板。您可能可以自定义
    django注册
    和内置的身份验证视图,以指向Jinja2模板。工作起来很有魅力,再次感谢@Alasdair!我还有一个问题,所以内置的django注册使用了login.html/logged_out.html等模板,是否可以用我的jinja base.html扩展它们,或者我应该有一个单独的django template base.html?你不能用jinja模板扩展django模板,反之亦然。我会尽量避免使用Jinja和Django的基本模板,这听起来像是不必要的重复。如果试图用Jinja模板覆盖
    注册/
    模板,则可能会出现问题,因为使用Django模板的Django管理员也会使用这些模板。您可能可以自定义
    django注册
    和内置身份验证视图,以指向Jinja2模板。