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

没有Django模板中的自定义变量,如何完成下面的代码,django,django-templates,Django,Django Templates,在上面的代码中,我只想在当前用户尚未投票的情况下显示投票选项一次。上面的代码为voterlog中的每个条目多次打印投票选项。Django不允许我设置一个自定义变量,比如布尔值,我可以用它来切换HasVote变量。如何使用Django模板修复此代码 感谢您的帮助因为,正如您所提到的,没有办法在Django模板中设置状态,如果您没有查看代码的权限,那么就没有任何明智的方法来设置状态。如果您确实可以访问视图代码,那么最简单的解决方案——也是最正确的解决方案——是在视图中设置上下文变量user_has_

在上面的代码中,我只想在当前用户尚未投票的情况下显示投票选项一次。上面的代码为voterlog中的每个条目多次打印投票选项。Django不允许我设置一个自定义变量,比如布尔值,我可以用它来切换HasVote变量。如何使用Django模板修复此代码


感谢您的帮助

因为,正如您所提到的,没有办法在Django模板中设置状态,如果您没有查看代码的权限,那么就没有任何明智的方法来设置状态。如果您确实可以访问视图代码,那么最简单的解决方案——也是最正确的解决方案——是在视图中设置上下文变量user_has_vote,而不是在模板中迭代voterlogs

但是,如果您没有访问该视图的权限,则必须使用涉及一些客户端代码的黑客攻击,例如呈现Javascript以设置必要的状态,然后添加一些进一步的Javascript以检查该状态,并在页面加载后调整DOM

看来你的逻辑是错误的。当且仅当在循环中找到当前用户时,您需要设置状态的东西,如:

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

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

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

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

应将此代码移到视图中。对于django认为的模板责任,您做的太多了。我按照建议将逻辑移到了视图中。结果很简单。谢谢这不是django模板解决方案。这是一个javascript客户端解决方案。我只是想澄清一下。它强调了这样一个事实,即这个解决方案应该完全转移到视图中。我重新表述了一下,试图澄清它不是一个纯粹的服务器端解决方案。当然,这不是一个好的解决方案但是,当使用托管的应用程序时,我有时不得不依赖这种模式,这些应用程序允许我完全访问模板,例如,通过管理员的web界面,但无法控制视图代码。因此,虽然我100%同意应该将解决方案转移到视图中,但这种模板驱动的客户端脚本攻击有时是唯一可行的解决方案。毫无疑问,这是一个很好的信息。我只是希望OP最终能将此移动到查看他们是否有权完全访问自己的项目。有一些方便的视图可以直接将模型渲染到视图,但是手动执行此操作并在模板中执行模型查询似乎不合适。
{% if user not in voters %}
    "user is allowed to vote"
{% endif %}