Использование переменной jinja в качестве ключа словаря
Я делаю приложение на django для работы с тестами/экзаменами. Две модели в этом приложении - это модель "Вопрос" и модель "Ответ", которые имеют отношение один-ко-многим. На странице каждый вопрос будет перечислен со всеми возможными ответами под ним, которые пользователь может выбрать.
В моем файле views.py
, после получения списка объектов вопросов, лучший способ хранения ответов, который я придумал, был в словаре, как например:
answers = {}
for question in questions:
answers[question.id] = Answer.objects.filter(question=question.id)
Затем, для шаблона, я думал, что смогу сделать что-то вроде:
{% for question in questions %}
<h2>{{ question.title }}</h2>
<ul>
{% for answer in answers.{{ question.id }} %}
<li>{{ answer.title }}</li>
{% endfor %}
</ul>
{% endfor %}
Ошибка возникает в этой строке - {% for answer in answers.{{ question.id }} %}
.
Я пробовал переписать эту строку в соответствии с этим постом, в котором предлагались такие вещи, как:
{% for answer in answers[question.id] %}
и
{% for answer in answers.get(question.id) %}
но ничего из этого не сработало.
Пожалуйста, сообщите мне, есть ли в Jinja синтаксис, который позволяет это сделать, или если есть лучший способ передать переменную answers
в моем views.py
файле вообще.
Йонас Груманн дал мне ответ.
Я смог создать список ответов на каждый вопрос с помощью функции _set.all()
, о которой я только что узнал, что она существует.
Выпьем за Джонаса!
Вы можете использовать соглашение _set.all(), чтобы получить все связанные элементы:
{% for answer in question.answer_set.all %}
{{ answer.id }}
{% endfor %}
Это работает, но если вы хотите иметь более читабельную версию, вы можете определить related_name
в вашей модели:
class Question(models.Model):
prompt = (models.CharField)
class Answer(models.Model):
question = models.ForeignKey(Question, related_name="answers")
correct = models.BooleanField()
prompt = models.CharField()
И тогда вы можете использовать это связанное имя вместо _set
:
{% for answer in question.answers.all %}
{{ answer.id }}
{% endfor %}
что делает его немного более читабельным.