Цикл выводит результат всех пользователей
Делаю сайт на Django. В профиле пользователя я сделал вывод названия цвета, за который проголосовал пользователь и все отлично работает. Однако цикл выводит результат не конкретного пользователя, профиль которого мы просматриваем, а ВСЕХ проголосовавших. Как мне сделать так, чтобы был выведен результат определенного юзера?
models.py
class Choose(models.Model):
count_black = models.PositiveIntegerField(default=0, verbose_name="black")
count_white = models.PositiveIntegerField(default=0, verbose_name="white")
count_purple = models.PositiveIntegerField(default=0, verbose_name="purple")
voter = models.ForeignKey(User, null=True, blank=True, verbose_name='Пользователь',
on_delete=models.PROTECT)
views.py
class Profile(TemplateView):
template_name = 'registration/profile.html'
def get(self, request, username):
values = Choose.objects.all()
# получаем пользователя по username если он существует
user = get_object_or_404(User, username=username) # используем для вывода уникальной информации пользователя
# передаем его в шаблон как profile
return render(request, self.template_name, {'profile': user, "values": values})
profile.html:
{% for v in values %}
{% if v.count_black %}
<h2 class="text_color_light" align="center">
<p align="center">Voted for black</p>
</h2>
{% elif v.count_white %}
<h2 class="text_color_light" align="center">
<p align="center">Voted for white</p>
</h2>
{% elif v.count_purple %}
<h2 class="text_color_light" align="center">
<p align="center">Voted for purple</p>
</h2>
{% endif %}
{% endfor %}
Что мне нужно исправить? Подскажите пожалуйста.
Ответы (1 шт):
У тебя немного не правильно сделан запрос
values = Choose.objects.all() # здесь ты получаешь все данные из модели цветов
Чтобы конкретно делать запрос по пользователю тебе надо сделать такой запрос
def get(self, request, username):
# получаем пользователя по username если он существует
user = get_object_or_404(User, username=username) # используем для вывода уникальной информации пользователя
values = user.choose_set.all()
# передаем его в шаблон как profile
return render(request, self.template_name, {'profile': user, "values": values})
Что-бы вообще было хорошо, добавь в модель Choose related_name
class Choose(models.Model):
count_black = models.PositiveIntegerField(default=0, verbose_name="black")
count_white = models.PositiveIntegerField(default=0, verbose_name="white")
count_purple = models.PositiveIntegerField(default=0, verbose_name="purple")
voter = models.ForeignKey(User, null=True, blank=True, verbose_name='Пользователь',
on_delete=models.PROTECT, related_name='chooser')
Не забудь сделать миграции, т.к. модель изменилась
python mysite/manage.py makemigrations
python mysite/manage.py migrate
Тогда view будет выглядеть так
def get(self, request, username):
# получаем пользователя по username если он существует
user = get_object_or_404(User, username=username) # используем для вывода уникальной информации пользователя
values = user.chooser.all()
# передаем его в шаблон как profile
return render(request, self.template_name, {'profile': user, "values": values})
Линки для чтения
P.S. обратил внимание, что у тебя 1 пользователь имеет возможность проголосовать несколько раз и проголосовать за разные цвета, надеюсь ты такие случае отбраковываешь. Так же для дебага запросов рекомендую использовать django shell
python mysite/manage.py shell