0
            {%  for voter in opt.voterlog_set.all  %}
                {% if user.id != voter.voter.id %}
                    <span data-url="{% url vote %}" data-id="{{ opt.id }}" class="button">vote</span>
                {% endif %}
            {% endfor %}

在上面的代码中,我只想在当前用户尚未投票时才显示一次投票选项。上面的代码多次打印出投票选项(对于 voterlog 中的每个条目一次)。Django 不允许我设置自定义变量,例如我可以用来切换 hasVoted 变量的布尔值。如何使用 Django 模板修复此代码?

谢谢你的帮助

4

2 回答 2

0

正如您所提到的,由于无法在 Django 模板中设置状态,因此如果您无权访问视图代码,则没有任何明智的方法可以做到这一点。如果您确实可以访问视图代码,那么最简单的解决方案 - 并且总而言之,最正确的解决方案 - 是user_has_voted在视图中设置一个上下文变量,而不是在模板中遍历 voterlogs。

但是,如果您无权访问视图,则必须使用涉及一些客户端代码的 hack,例如渲染 Javascript 以设置必要的状态,然后添加一些进一步的 Javascript 来检查该状态并调整 DOM页面加载后。

不过,您的逻辑似乎是错误的。当且仅当在循环中找到当前用户时,您才需要设置状态的东西,如下所示:

        {%  for voter in opt.voterlog_set.all  %}
            {% if user.id == voter.voter.id %}
            <script type="text/javascript">
            window.user_has_voted = true;
            </script>
            {% endif %}
        {% endfor %}

        <script type="text/javascript">
        if( !window.user_has_voted ) {
          document.write('<span data-url="{% url vote %}" data-id="{{ opt.id }}" class="button">vote</span>');
        }
        </script>

请注意,这是一个特别讨厌的 hack —— 只有当您只能访问模板并且无法控制发送到模板的上下文变量时,才应该使用它。

于 2012-06-18T04:13:12.850 回答
0

可能这不是您想要的,但是如何在您的视图中创建选民列表,并将其添加到模板上下文中。然后

{% if user not in voters %}
    "user is allowed to vote"
{% endif %}
于 2012-06-18T06:43:28.643 回答