Проверьте, является ли пользователь следующим пользователем? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть 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 input.Что не так с моей логикой?Почему вместо этого не отображается следующая кнопка ввода?

1 Ответ

0 голосов
/ 07 июня 2018

Проблема в том, что 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...