vikas devde
vikas devde

Reputation: 11741

How to call a model function from template?

I am calling my models(Answer) function isupvoted from template while iterating over all answers that are being shown on page to see if the loggedin user has liked the iterating answer. My Answer and Upvote models are as below.

class Answer(models.Model):
    answer_text = models.TextField(max_length=5000)
    answer_author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='ans_auth')
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    a_pub_date = models.DateTimeField('Date Answer Published')
    a_modified_date = models.DateTimeField('Date Answer Modified', null=True, blank=True)

    def __str__(self):
        return self.answer_text

    def isupvoted(self, request):
        counter = UpvoteAnswerMod.objects.filter(answer=self, upvote_user=request.user).count()
        print("upvote count: "+counter)
        return counter


class UpvoteAnswerMod(models.Model):
    answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
    upvote_user = models.ForeignKey(User, on_delete=models.CASCADE)
    upvote_date = models.DateTimeField('Date Upvoted')

I am calling the function as below

{% if answer.isupvoted == 1 %}
   <a class="upvote pressed" href="#" >Downvote</a>
{% else %}
   <a class="upvote" href="#" >Upvote</a>
{% endif %}

But answer.isupvoted is not returning anything. How do I get the upvote count?

Upvotes: 1

Views: 88

Answers (1)

dmitryro
dmitryro

Reputation: 3506

In your model, use @property:

@property
def isupvoted(self, user):
    try:
        counter = UpvoteAnswerMod.objects.filter(answer=self, 
                                                 upvote_user=user).count()
        print("upvote count: "+counter)
        return counter
    except ObjectDoesNotExist as e:
        print("Not Found - {}".format(e))
        return 0

Upvotes: 1

Related Questions