#django #django-models #django-queryset
Вопрос:
Желаемый результат: Когда я визуализирую опросник и связанные с ним комментарии, я хотел бы также отобразить Vote
пользователя, выбранного для опроса, вместе с его комментарием (Примечание: Пользователь может комментировать только в том случае, если он проголосовал за этот опросник).
Примечание: Пользователь может отдать один голос участнику опроса и оставить один комментарий участнику опроса. Он может комментировать только в том случае, если проголосовал заранее.
# Models
class Poller(models.Model):
poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(Account, on_delete=models.CASCADE)
poller_text = models.CharField(max_length=333)
poller_choice_one = models.CharField(max_length=20)
poller_choice_two = models.CharField(max_length=20)
class Vote(models.Model):
poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='vote')
user = models.ForeignKey(Account, on_delete=models.CASCADE)
created_on = models.DateTimeField(auto_now_add=True)
poller_choice_one_vote = models.BooleanField(default=False)
poller_choice_two_vote = models.BooleanField(default=False)
def __str__(self):
return f'Vote by {self.user}'
class Comment(models.Model):
poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='PollerComment')
user = models.ForeignKey(Account, on_delete=models.CASCADE)
created_on = models.DateTimeField(auto_now_add=True)
comment = models.TextField(max_length=350)
flag_count = models.IntegerField(default=0)
upvote_count = models.IntegerField(default=0)
downvote_count = models.IntegerField(default=0)
# View
@require_GET
def render_single_poller(request, poller_id):
# Retrieve comments associated to the Poller
comments_qs = PollerComment.objects.filter(poller_id=poller_id)
context = {
'comments_qs': comments_qs,
}
return render(request, 'pollboard/single_poller.html', context)
Я попытался сделать это с помощью шаблона фильтра, например:
# pollboard_tags.py
@register.filter(name='get_vote')
def get_voted(self):
self.vote_made = 'Test'
print(self.vote.poller_choice_one_vote)
if self.vote.poller_choice_one_vote:
self.vote_made = 'One'
else:
self.vote_made = 'Two'
return self.vote_made
# template
<div class="commentors-poller-choice">{{ comment|get_vote }}</div>
бросает
Связанный объект не существует по адресу /опросник/68c725eb-277e-4b5b-a61b-b4a02bf5e854/ Опрос не имеет права голоса.
Я боюсь, что я уже все здесь усложняю. Я надеюсь, что для этого есть более простое решение, например, idk, расширяющий набор запросов комментариев необходимой информацией для рендеринга?
Комментарии:
1. Попытайтесь измениться
self.vote = 'Two'
наself.vote_made = 'Two'
. Еслиself.vote.poller_choice_one_vote
возвращает false,self.vote_made
будет пусто2. @BrianD ах, спасибо за подсказку, но она все равно ничего не возвращает.. Однако я визуализирую другие поля в цикле шаблонов, поэтому набор запросов существует
3. Как вы фильтруете с
PollerComment
помощью ?PollerComment
является ли родственное имя, а не модель правильным?
Ответ №1:
Если пользователь может проголосовать за опрашиваемого только один раз, вы можете отфильтровать его с помощью:
@register.filter(name='get_vote')
def get_voted(self):
vote = Vote.objects.get(poller=self.poller, user=self.user)
return 'One' if vote.poller_choice_one_vote else 'Two'
Ответ №2:
Попробуй вот это:
def get_vote(self):
"""
Get the vote made to the Poller
of the user who commented
"""
self.vote_made = ''
if self.vote.poller_choice_one_vote==True:
self.vote_made = 'One'
else:
self.vote = 'Two'
return self.vote_made
Комментарии:
1. вызывает ошибку: объект «Опрос» не имеет атрибута «голос__опрашиваемый_выбор_один_голос». (также ваше логическое значение в нижнем регистре)
2. попробуй сейчас……..