我有一个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输入按钮。我的逻辑出了什么问题?为什么不显示以下输入按钮?
答案 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 %}