Django if语句检查模板中for循环中manytomanyfield中的值

Django if语句检查模板中for循环中manytomanyfield中的值,django,Django,在我的项目中,用户有很多他们关注的用户。当他们查看跟踪他们的用户列表时,我想根据他们是否在跟踪列表中有该用户显示一个跟踪/取消跟踪链接。例如,如果B在A之后,而A在B之后,那么当A查看B的以下列表时,B的名称旁边应该有一个Unfollow链接 不幸的是,它总是说“(Follow)”,而且从不给我“(Remove)”链接,即使我是作为一个已经跟踪该用户的用户登录的 我的用户配置文件模型: class UserProfile(models.Model): user = models.OneT

在我的项目中,用户有很多他们关注的用户。当他们查看跟踪他们的用户列表时,我想根据他们是否在跟踪列表中有该用户显示一个跟踪/取消跟踪链接。例如,如果B在A之后,而A在B之后,那么当A查看B的以下列表时,B的名称旁边应该有一个Unfollow链接

不幸的是,它总是说“(Follow)”,而且从不给我“(Remove)”链接,即使我是作为一个已经跟踪该用户的用户登录的

我的用户配置文件模型:

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='user_object')
    visible = models.BooleanField(default=True)
    bio = models.TextField(null=True, blank=True)
    avatar = models.FileField(upload_to=get_upload_file_name, null=True, blank=True)
    following = models.ManyToManyField(User, related_name='following_list')
以及我试图在模板中使用的代码:

{% for f in followers %}
    <a href="/accounts/profile/{{f.user.id}}/">{{f.user.username}}</a> 
    {% if thisuser.user_object.following.all == f.user %}
        <a href="/accounts/profile/{{f.user.id}}/unfollow/">(Remove)</a>
    {% else %}
        <a href="/accounts/profile/{{f.user.id}}/follow/">(Follow)</a>
    {% endif %}
{% endfor %}
{% for f,following in followers %}
    <a href="/accounts/profile/{{f.user.id}}/">{{f.user.username}}</a> 
    {% if following %}
        <a href="/accounts/profile/{{f.user.id}}/unfollow/">(Remove)</a>
    {% else %}
        <a href="/accounts/profile/{{f.user.id}}/follow/">(Follow)</a>
    {% endif %}
{% endfor %}

在视图中装饰对象,使模板中的生活更轻松:

from django.shortcuts import render

def followers(request, user_id=1):

    user = User.objects.get(pk=user_id)
    followers = UserProfile.objects.filter(following=request.user)

    args = {}
    args['following'] = request.user
    args['userlookup'] = User.objects.get(pk=user_id)
    args['followers'] = []

    for f in followers:
        user_status = (f, request.user.user_object.following_list.filter(pk=f.pk).exists())
        args['followers'].append(user_status)

    return render(request, 'followers.html', args)
关键部分是:

(f, request.user.user_object.following_list.filter(pk=f.pk).exists())
这是一个2元组,第一项是用户配置文件对象,如果跟踪此用户,则第二项为True或False。如果查询将返回结果,则queryset方法将返回True。我使用它来标记每个用户对象

然后,我在一个列表中收集这个用户配置文件对象的“修饰”列表,该列表作为上下文变量followers发送到模板

您应该避免在模板中执行复杂的逻辑,并尽可能使用视图发送有关对象的额外信息。这不仅提高了应用程序的性能(对于繁重的处理和最难调试的部分,模板不是最佳的);但也可以让你的模板不受任何逻辑的影响——超出显示内容所需的范围

现在,在模板中:

{% for f in followers %}
    <a href="/accounts/profile/{{f.user.id}}/">{{f.user.username}}</a> 
    {% if thisuser.user_object.following.all == f.user %}
        <a href="/accounts/profile/{{f.user.id}}/unfollow/">(Remove)</a>
    {% else %}
        <a href="/accounts/profile/{{f.user.id}}/follow/">(Follow)</a>
    {% endif %}
{% endfor %}
{% for f,following in followers %}
    <a href="/accounts/profile/{{f.user.id}}/">{{f.user.username}}</a> 
    {% if following %}
        <a href="/accounts/profile/{{f.user.id}}/unfollow/">(Remove)</a>
    {% else %}
        <a href="/accounts/profile/{{f.user.id}}/follow/">(Follow)</a>
    {% endif %}
{% endfor %}

这看起来像是可行的?生成的HTML是什么样子的?它做了什么不应该做的事?这里的问题到底是什么?抱歉,我将进行编辑以反映-它不起作用,即使我已经在跟踪用户,它也只显示我(跟踪)。谢谢,这样做了!现在,我需要进一步研究你的答案,以了解为什么它有效。我添加了一些解释来帮助你。今天早上再次检查,不幸的是,它似乎没有100%有效-如果我跟踪三个人,那么第三个链接总是说“跟踪”,即使我跟踪他们。如果我在跟踪两个人,那么第一个链接总是说“跟踪”。这真的很接近,但出于某种原因,它似乎不一致。我会按照你的例子继续玩