如何从详细信息视图检查相关对象的状态?

时间:2020-07-05 07:35:07

标签: django django-models django-views django-templates

在这里,我要检查问题的答案是否已被当前用户投票。

为此,我尝试了这种方法,但我认为这行不通。

出于某种目的,我想在模板中执行此操作,例如{% if a_voted %}Voted{% else %}Vote{% endif %}

我做了一个问题,但是在回答问题时卡住了。

模型

  class Answer(models.Model):
        question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
        ans = models.TextField()
        user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='user_answers')
    
    class AnswerVote(models.Model):
        answer = models.ForeignKey(Answer, on_delete=models.CASCADE, related_name='answer_votes')
        user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_votes_ans')

观看次数

class DetailQuestionView(LoginRequiredMixin, View):
    template_name = 'post_detail.html'

    def get(self, request, **kwargs):
        question = get_object_or_404(Question, pk=kwargs['pk'])
        q_voted = question.question_votes.filter(user=request.user, question=question).exists()
        answers = question.answers.all()
        a_voted = [True if answer.answer_votes.filter(user=request.user, answer=answer).exists() else False for answer in answers]
        context = {
            'question': question,
            'q_voted': q_voted,
            'a_voted': a_voted,
        }

模板

{% for answer in question.answers.all %}
    <p>{{answer.ans}}</p>
     <form action="{% url 'qa:vote_ans' answer.pk %}" method="post" id="a-vote-form ">
    {% csrf_token %}
    <button type="submit"
     class="{% if a_voted %}btn btn-danger disabled{% else %} btn btn-success{% endif %}">
     {% if a_voted %}Voted{% else %}Vote{% endif %}</button>
      </form>

{% endfor %}

2 个答案:

答案 0 :(得分:0)

我通过列出当前用户的投票答案来解决此问题,并检查答案是否在投票答案列表中,如这样的模板

观看次数

a_voted_list = [answer for answer in answers if answer.answer_votes.filter(user=request.user, answer=answer)]

模板

{% if answer in a_voted_list %}Voted{% else %}Vote{% endif %}</button>

如果有更好的方法,请告诉我。

答案 1 :(得分:0)

由于您可以通过a_voted_list访问用户投票的答案列表,因此无需创建user.answervote_set.all()

{% if answer in request.user.answervote_set.all %}Voted{% else %}Vote{% endif %}
相关问题