Как это может выглядеть?

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Django.
Подскажите, как может выглядеть логика вывода пользователей, проголосовавших за определенный вариант.
Нужно ли использовать для этого контроллер-классы или можно обойтись функциями?

На моем сайте 3 фиксированных варианта и для каждого я планирую отображать отдельную страницу с юзерами.
У меня есть предположение, но насколько она "кривая"?
Python:
# voter и поля с count находятся в models

value, created = Choose.objects.get_or_create(voter=request.user)
if value.count_white > 0 and value.count_black == 0 and value.count_purple == 0:
    *код, чтобы пользователь попадал именно в эту страницу, если он выбрал за белый*
   
# Потом перебрать всех таких пользователей в html шаблоне

С наступающим!
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Подскажите, как может выглядеть логика вывода пользователей, проголосовавших за определенный вариант.
Вот так например:
Ссылка на страницу (url):
Python:
from django.urls import path
from . import views

urlpatterns = [
    ...
    path('show_black', views.show_black, name='show_black'),
]
Контроллер (view):
Python:
from django.shortcuts import render
from .models import Choose

def show_black(request):
    # получаем всех голосовавших за черный цвет (1 или более раз)
    black_voters = Choose.objects.filter(count_black__gte=1)
    # передаем в шаблон
    return render(request, 'app_name/black_voters.html', {'voters': black_voters})
Шаблон:
HTML:
{# app_name/black_voters.html #}
<h1>Проголосовавшие за черный цвет</h1>

{% if voters %}
{%for v in voters%}
    <p>{{v.username}} - голосовал {{v.count_black}} раз</p>
{% endfor %}
{% endif %}
 
  • Мне нравится
Реакции: Domohod45

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Если эти выводимые пользователи должны быть абсолютными ссылками на их профиль - то должна создаваться отдельная модель(как вы говорили).
В модели можно прописать метод (например, get_absolute_url):
Python:
# допустим ссылка на профиль у вас такая app/accounts/username
# можно сделать для нее ссылочный шаблон (path в urls.py)
path('accounts/<str:username>', views.get_profile, name='get_profile'),
Python:
# в модели прописать метод для получения абсолютной ссылки
from django.shortcuts import reverse

class Choose(models.Model):
    ...
    def get_absolute_url(self):       
        return reverse('get_profile', kwargs={'username': self.voter.username})
HTML:
{# в шаблоне поменять имя на ссылку #}
<h1>Проголосовавшие за черный цвет</h1>
 
{%for v in voters%}
    <p><a href="{{v.get_absolute_url}}">{{v.voter}}</a> - голосовал {{v.count_black}} раз</p>
{% endfor %}
Python:
# метод во views для просмотра профиля (просто для примера)

def get_profile(request, username):
    # получаем пользователя по username если он существует
    user = get_object_or_404(User, username=username)
    # передаем его в шаблон как profile
    return render(request, 'app_name/profile.html', {'profile': user})
 
Последнее редактирование:
  • Мне нравится
Реакции: Domohod45

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Вот так например:
Ссылка на страницу (url):
Python:
from django.urls import path
from . import views

urlpatterns = [
    ...
    path('show_black', views.show_black, name='show_black'),
]
Контроллер (view):
Python:
from django.shortcuts import render
from .models import Choose

def show_black(request):
    # получаем всех голосовавших за черный цвет (1 или более раз)
    black_voters = Choose.objects.filter(count_black__gte=1)
    # передаем в шаблон
    return render(request, 'app_name/black_voters.html', {'voters': black_voters})
Шаблон:
HTML:
{# app_name/black_voters.html #}
<h1>Проголосовавшие за черный цвет</h1>

{% if voters %}
{%for v in voters%}
    <p>{{v.username}} - голосовал {{v.count_black}} раз</p>
{% endfor %}
{% endif %}
Большое спасибо!
Однако, у меня не отображались имена пользователей. Я это исправил, заменив
Код:
{{v.username}}
# на
{{v.voter}}

И у меня еще вопрос... Если эти выводимые пользователи должны быть абсолютными ссылками на их профиль - то должна создаваться отдельная модель(как вы говорили). Но что мне туда прописывать, если django-allauth уже включает в себя поля по типу password, email. Достаточно будет изменить username, как уникальное значение?
 
Последнее редактирование:

Форум IT Специалистов