Django forloop внутри forloop в шаблоне
Здравствуйте, я пытаюсь сделать выпадающее меню в Navbar с помощью кверисетов. Я пытался сделать это с помощью двух наборов запросов, отправленных в html шаблон ("этапы", "вопросы"), которые связаны друг с другом по ключу (id , stage_id), но я не могу понять, почему forloops не может работать вместе. Моя вторая попытка была с передачей данных в json в javascript и сделать это с js QuerySelector, но django querysets не JSON serializable. Есть предложения, как сделать это, пожалуйста,
views.py
def edit_pages(request, gameid):
stages = Stage.objects.filter(game_id=gameid)
print(stages)
questions = []
for st in stages:
questions = chain(questions,Question.objects.filter(stage_id=st.id))
print(questions)
return render(request, "homeSuperuser/edit_pages.html",{'stages': stages, 'questions': questions})
html
<body>
<div class="topnav">
{% for st in stages %}
<div class="dropdown">
<button class="dropbtn">{{st.stage_name}}</button>
<div class="dropdown-content">
{% for qs in questions %}
{% if qs.stage_id == st.id %}
<a href="#">{{qs.question_name}}</a>
{% endif %}
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</body>
Определите метод модели следующим образом
class Stage(models.Model):
name = models.CharField(max_length=128)
def get_questions(self):
return Question.objects.filter(stage=self)
def __str__(self):
return str(self.name)
class Question(models.Model):
stage = models.ForeignKey(Stage, on_delete=models.PROTECT, related_name="questions")
name = models.CharField(max_length=128)
def __str__(self):
return str(self.name)
Теперь вы можете зациклить их в шаблоне следующим образом
{% for st in stages %}
<div class="dropdown">
<button class="dropbtn">{{st.stage_name}}</button>
<div class="dropdown-content">
{% for qs in st.get_questions %}
{% if qs.stage_id == st.id %}
<a href="#">{{qs.question_name}}</a>
{% endif %}
{% endfor %}
</div>
</div>
{% endfor %}