检查用户是否关注用户?

时间:2018-06-07 03:56:12

标签: python django orm jinja2

我有一个DetailView,可以像这样呈现个人资料页面:

class ProfileView(DetailView):
    model = User
    slug_field = 'username'
    template_name = 'oauth/profile.html'
    context_object_name = 'user_profile' 

用户模型包含有关用户的字段,如id, username, email, password我还有另一个与此用户模型具有一对多关系的模型。它显示了用户关注的对象:

class Following(models.Model):
    target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True)
    follower = models.ForeignKey('User', related_name='targets', on_delete=models.CASCADE, null=True)

    def __str__(self):
        return '{} is followed by {}'.format(self.target, self.follower)

在我的模板中,我有以下逻辑:

<form method="post" action="">
       {% csrf_token %}
        {% if user in user_profile.followers.all %}
              <input type="submit" class="item profile-nav__follow-btn" value="Following">
        {% else %}
              <input type="submit" class="item profile-nav__follow-btn" value="Follow">
        {% endif %}
</form>

我正在尝试检查用户是否关注该特定用户。但是,即使它应该是真的,也会显示Follow输入按钮。我的逻辑出了什么问题?为什么不显示以下输入按钮?

1 个答案:

答案 0 :(得分:1)

问题是user_profile.followers.all将返回Following个实例的列表,而不是用户。所以user in user_profile.followers.all将不起作用。您可以使用此查询检查关注者:

user_profile.followers.filter(follower=self.request.user).exists()

由于您无法在模板中使用此查询,因此您可以覆盖get_context_data并将结果放入上下文中:

class ProfileView(DetailView):
    model = User
    slug_field = 'username'
    template_name = 'oauth/profile.html'
    context_object_name = 'user_profile' 

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['is_follower'] =  self.object.followers.filter(follower=self.request.user).exists()
        return context 

不在模板中使用变量is_follower代替:

{% if is_follower %}