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

时间:2014-04-15 04:10:05

标签: django

在我的项目中,用户拥有他们所关注的许多用户。当他们查看关注他们的用户列表时,我想显示一个关注/取消关注链接,具体取决于他们是否在他们的以下列表中有该人。例如,如果B跟随A,A跟随B,那么当A查看其下列列表时,B名称旁边应该有一个取消关注链接。

不幸的是,它总是说“(跟随)”并且从未给我“(删除)”链接,即使我已经以已经关注该用户的用户身份登录。

我的userprofile模型:

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

在我的观点中,我发送:

def followers(request, user_id=1):
    thisuser = request.user
    userlookup = User.objects.get(id=user_id)
    following = thisuser
    followers = UserProfile.objects.filter(following=thisuser)

    args = {'following': following, 'thisuser': thisuser, 'userlookup': userlookup, 'followers': followers}
    args.update(csrf(request))

    return render_to_response('followers.html', args)

1 个答案:

答案 0 :(得分:1)

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

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。如果查询返回结果,则exists() queryset方法返回True。我用它来标记每个用户对象。

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

您应避免在模板中执行复杂的逻辑,并尽可能使用视图发送有关对象的额外信息。这不仅增强了应用程序的性能(模板不适合繁重的处理,也是最难调试的部分);同时也保证您的模板不受任何逻辑的限制 - 超出显示内容所需的范围。

现在,在您的模板中:

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

您无需将request.user传递给模板,而是确保在您的设置中启用request context processor

import django.conf.global_settings as DEFAULT_SETTINGS

TEMPLATE_CONTEXT_PROCESSORS += DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS+(
    'django.core.context_processors.request',
)
相关问题