Как построить логику опции голосования с двумя вариантами выбора в Django
У меня есть объект/модель Poller, который содержит вопросы, каждый из которых имеет два возможных варианта для голосования. Теперь я хочу дать пользователю возможность проголосовать за любой из них. Я думал добавить два поля голосования в саму модель Poller
, но тогда я не смогу выяснить, кто из пользователей проголосовал, верно?
Поэтому я решил установить модель Vote
, чтобы иметь возможность связать каждый голос с User
и Poller
.
Однако это приводит меня к следующим двум проблемам:
I am not sure how to render the Vote form, since it contains two boolean fields only. My idea is to simply create two html divs containing the choice_fields of
Poller
model and trigger an ajax call as soon as a user clicks on one of the two choices to vote (so I wouldn't render the Vote Form at all)Doing so, I am not sure how to handle this logic in the view. My idea is to change the boolean field of the choice that was selected to True and the other to False (in case the users changes his vote from Foo to Bar).
Модель и форма голосования
class Vote(models.Model):
poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='vote')
user = models.ForeignKey(Account, on_delete=models.CASCADE)
poller_choice_one_vote = models.BooleanField(default=False)
poller_choice_two_vote = models.BooleanField(default=False)
class VoteForm(ModelForm):
class Meta:
model = Vote
fields = ['poller_choice_one_vote', 'poller_choice_two_vote']
Модель поллера
class Poller(models.Model):
poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_by = models.ForeignKey(Account, on_delete=models.CASCADE)
poller_text = models.CharField(max_length=250)
poller_choice_one = models.CharField(max_length=30)
poller_choice_two = models.CharField(max_length=30)
Вид
def submit_vote(request, poller_id):
# Retrieve the poller item
poller = Poller.objects.get(poller_id=poller_id)
# Get the current user
user = request.user
# Get the selected vote option
vote = ??
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = VoteForm(request.POST)
# Create Vote object but don't save to database yet
new_vote = form.save(commit=False)
# Assign the current post to the comment
new_vote.poller = poller
new_vote.user = user
# Change boolean of selected vote option to True
if vote ==
new_vote.save()
# redirect to a new URL:
return redirect(pollboard)
Текущий шаблон
<div id="poller-row-two" class="row">
<div id="poller-choice-one" class="poller-choice">
{{ poller.poller_choice_one }} / {{ poller.poller_choice_one_votes }}
</div>
<div id="poller-choice-two" class="poller-choice">
{{ poller.poller_choice_two }} / {{ poller.poller_choice_two_votes }}
</div>
</div>