【问题标题】:Jinja2 conditions not working correctly while iteratingJinja2 条件在迭代时无法正常工作
【发布时间】:2016-12-05 22:44:37
【问题描述】:

我使用 Python、Google App Engine 和 Jinja2 创建了一个博客。我有一个持有喜欢帖子的实体,不包括帖子作者。我正在遍历所有喜欢帖子的用户并对其进行比较,以便创建帖子的用户不能喜欢自己的帖子。我还有一个不一样的按钮,只有在有人喜欢帖子时才会出现。我可以喜欢和不喜欢该帖子;用户喜欢一个帖子并且出现了不同的按钮,问题是喜欢按钮不会消失它出现在不同的按钮旁边,这会导致用户多次喜欢同一个帖子并显示尽可能多的不同按钮用户点击了like按钮。变量username是当前登录的用户

{% for like in likes %} 
    {% if post.username != username and like.username != username %}
    <li>
        <form method="POST" id="likeForm">
            <input type="hidden" name="likePost" value="{{post.key().id()}}">
            <button type="submit" class="btn btn-outline-success btn-sm" form="likeForm">Like</button>
        </form>   
    </li>
    {% endif %}   
    {% if post.username != username and like.username == username %}
    <li>
        <form method="POST" id="unlikeForm">
            <input type="hidden" name="unlikePost" value="{{like.key().id()}}">
            <button type="submit" class="btn btn-outline-danger btn-sm" form="unlikeForm">Unlike</button>
        </form>   
    </li>
    {% endif %}
{% endfor %}

【问题讨论】:

    标签: python google-app-engine jinja2


    【解决方案1】:

    您误解了代码的行为。显示Like按钮的条件是:

    {% if post.username != username and like.username != username %}
    

    意味着对于用户除了 username 生成的likes 列表中的每个like,都会显示一个Like 按钮,而不管username 是否喜欢发布与否。可能不是你所追求的。你不应该在迭代likes时显示Like,你应该只显示一次,如果在遍历所有likes之后你没有找到username产生的任何东西。

    至于多个Unlike 按钮 - 我怀疑当按下Like 按钮时,您没有在帖子上检查来自username 的现有like,因此允许多个这样的like 实例在likes 列表中 - 它们中的每一个都会导致出现Unlike 按钮。

    我只是在 python 中执行逻辑(比 jinja2 更容易,可能也更快):

    if post.username != username:
        post.liked = False
        for like in likes:
            if like.username == username:
                post.liked = True
                break
    

    在 jinja2 中:

    {% if post.username != username %}
        {% if post.liked %}
            <li>
                <form method="POST" id="unlikeForm">
                    <input type="hidden" name="unlikePost" value="{{like.key().id()}}">
                    <button type="submit" class="btn btn-outline-danger btn-sm" form="unlikeForm">Unlike</button>
                </form>   
            </li>
        {% else %}
            <li>
                <form method="POST" id="likeForm">
                    <input type="hidden" name="likePost" value="{{post.key().id()}}">
                    <button type="submit" class="btn btn-outline-success btn-sm" form="likeForm">Like</button>
                </form>   
            </li>
        {% endif %}
    {% endif %}
    

    注意:代码 sn-ps 没有实际测试过...

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2021-03-29
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多