Home > database >  how to pass one function context variable to another function in django , or what is the good method
how to pass one function context variable to another function in django , or what is the good method

Time:02-07

views.py

    def contest(request):
        context = {}
        all_contest = Contest.objects.all()        
        context["contest"] = all_contest
        return render(request,"contest.html",context)
    
    def contest_candidates(request,id):
        context = {}
        all_candidates_ = Contest_Candidates.objects.filter(contest_id = id)
        high_like = 0
        winner_ = ""
        for i in all_candidates_:
    
            if i.likes_count > high_like:
                high_like = high_like   i.likes_count
                winner_ = i.owner.name
    
        context["cadidates"] = all_candidates_
    
        return render(request,"view_contest_candidates.html",context)

urls.py

path("contest",views.contest, name="contest"),
path("candidates/<id>",views.view_contest_candidates, name="candidates"),

models.py

class Contest(models.Model):
    title = models.CharField(max_length=50)

class Contest_Candidates(models.Model):
    image = models.FileField( upload_to="contest_candidates/",)
    owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    contest = models.ForeignKey(Contest, on_delete=models.CASCADE,related_name='candidates')

    @property
    def likes_count(self):
       return self.likes.all().count() 

class CandidateLikes(models.Model):
    like = models.CharField(max_length=10)
    user = models.ForeignKey(CustomUser,on_delete=models.CASCADE,related_name='candidate_likes')
    contest_candidates = models.ForeignKey(Contest_Candidates, on_delete=models.CASCADE, related_name='likes')

how to pass the winner variable in to contest function ? i need to show that in contest.html

if it's not possible, which is the best method . want to show every contest winner in contest.html

CodePudding user response:

As far as I understand - winner variable is calculated in your second function.

Nothing prevents calculating it in contest as well:

models.py

class Contest(models.Model):
    title = models.CharField(max_length=50)

    @property
    def winner(self):
     high_like = 0
     all_candidates_ = Contest_Candidates.objects.filter(contest=self)
     winner = None
     for c in all_candidates_:
         if c.likes_count > high_like:
             winner = c.owner
     return winner

views.py

def contest(request):
    context = {"contests": Contest.objects.all()}
    
    return render(request,"contest.html",context)

def contest_candidates(request,id):
    contest = Contest.objects.get(id=id)
    context = {
        "contest": contest,
        "candidates": Contest_Candidates.objects.filter(contest=contest)
    }

    return render(request,"view_contest_candidates.html",context)

contest.html

{% for c in contests %}
    {{ c.title }}
    {{ c.winner.name }}
{% endfor %}
  •  Tags:  
  • Related