【问题标题】:Template not rendering properly with if user.is_authenticated for Django如果 user.is_authenticated 用于 Django,模板无法正确呈现
【发布时间】:2015-12-27 12:13:41
【问题描述】:

我正在尝试将模板标签/包含标签合并到我的站点侧边栏中。当我输入时,页面的主要部分会正确更新:

{% if user.is_authenticated %}
  <h1> Hello {{ user.username }}
{% else %}
  <h1> Hello </h1>
{% endif %}

当我尝试在我的模板标签/边栏中使用相同的原则时,它似乎忽略了 user.is_authenticated 并且总是显示“登录”和“注册”,而它应该只显示“注销”。

html 的正文(主索引页):

{% load Kappa_extras %}
<body>
<div class="container-fluid">
  <div class="row">
    <div class="col-sm-2" id="side_section">
      {% block sidebar %}
        {% get_game_list %}
      {% endblock %}
    </div>


<!--Main section-->
    <div class="col-sm-10" id="main_section">
      {% block body %}
      {% endblock %}
    </div>
  </div>
</div>

'Kappa_extras' 中的 get_game_list 函数:

from django import template
from Kappa.models import Game, Game_Page
from django.contrib.auth.models import User

register = template.Library()

@register.inclusion_tag('Kappa/sidebar.html')
def get_game_list():
    return {'game_list': Game.objects.all()}

和“Kappa/sidebar.html”:

<div id="side_default_list">
  <ul class="nav">
    <li><a href="{% url 'index' %}">Kappa</a></li>
    {% if user.is_authenticated %}
      <li><a href="{% url 'user_logout' %}">Log Out</a></li>
    {% else %}
      <li><a href="{% url 'user_login' %}">Log In</a></li>
      <li><a href="{% url 'register' %}">Register</a></li>
    {% endif %}

</div>

我检查了一些较旧的查询,但它们都没有正常工作。我尝试将请求放入 def get_game_list(request): 但它只是说没有收到参数的值。 user.is_authenticated 时如何让侧边栏正确更新?

【问题讨论】:

  • The {% get_game_list %} .py 是什么意思?这是一个实际的文件名吗?
  • 我认为它在django中被称为自定义模板标签。我正在使用 django 教程完成探戈,我真的很想将它合并到我的网站中。
  • 是的,我知道它是什么。我说的是python文件名中的特殊字符
  • 抱歉误传,不是py文件,而是那个标签的函数。

标签: python html css django authentication


【解决方案1】:

您需要将用户传递给您的包含标签。

@register.inclusion_tag('Kappa/sidebar.html')
def get_game_list(user):
    return {'game_list': Game.objects.all(),  'user': user}

然后在你的模板中,用

调用标签
{% get_game_list user %}

或者,您可以在包含标签中设置takes_context=True,以便您可以从模板上下文访问用户。

@register.inclusion_tag('Kappa/sidebar.html', takes_context=True)
def get_game_list(context):
    return {'game_list': Game.objects.all(),  'user': context['user']}

在这种情况下,您不再需要将用户传递给模板标签。

{% get_game_list %}

有关更多信息和其他示例,请参阅the docs

【讨论】:

  • 完美! take_context=True 方法可以解决所有问题。
猜你喜欢
  • 2015-04-01
  • 2017-06-29
  • 2012-06-05
  • 2015-03-20
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2015-08-22
相关资源
最近更新 更多