如何在Django模板中没有自定义变量的情况下完成下面的代码

时间:2012-06-18 04:01:37

标签: django django-templates

            {%  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 %}

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

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

但是,如果您无法访问该视图,则必须使用涉及某些客户端代码的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>

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

答案 1 :(得分:0)

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

{% if user not in voters %}
    "user is allowed to vote"
{% endif %}