Использование переменной 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 %}

что делает его немного более читабельным.

Вернуться на верх