Как сделать каскадный вызов элементов ForeignKey в одной view в Django? - Python
Формулировка задачи:
Задача: Вывести статью, в которой будет 3 вопроса (из относящейся модели), в каждом вопросе будет по 3 ответа (уже относящиеся к самому вопросу).
Общая модель статьи - к ней цепляется через ForeignKey 3 вопроса - к каждому вопросу через ForeignKey цепляется 3 варианта ответов. (cамих вопросов и ответов куча, поэтому через objects().all выводить нельзя).
Как это работает:
Я через url передаю question_id с помощью, которого определяю номер статьи от которой начинается работа. А вот потом у меня уже не получается достать ответы, которые относятся к вопросу, который мы получили до этого.
Сам шаблон вывода этой вьюшки (именно области с вопросами, ответами).
Листинг программы
- class Step(models.Model): #Основная статья
- title = models.CharField(max_length=200)
- description = models.CharField(max_length=200)
- annotation = models.TextField()
- main_text = models.TextField()
- def __str__(self):
- return self.title
- class Question(models.Model): #Модель вопросов
- step = models.ForeignKey(Step, on_delete=models.CASCADE)
- title = models.CharField(max_length=200, default = "pages")
- question_text = models.TextField()
- question_name = models.CharField(max_length=40, help_text="английские буквы", blank=True, null=True)
- class Answer(models.Model): #Модель ответов
- question = models.ForeignKey(Question, on_delete=models.CASCADE)
- choice_text = models.TextField()
- votes = models.IntegerField(default=0)
- answer_name = models.CharField(max_length=40, help_text="английские буквы", blank=True, null=True)
Листинг программы
- url(r'^question(?P<question_id>[0-9]+)$', 'bakot.views.question', name='question'),
- def question(request, question_id):
- stepfields = get_object_or_404(Step, id = question_id) # вывод основной статьи
- questionship = Question.objects.filter(step_id = question_id) #step_id - это номер, которым вытаскиваем относящиеся вопросы.
- answership = questionship.prefetch_related().all # а вот эта штука и не работает собственно. А через фильтр пробросить не получится, так как мы не знаем id.
- context = {
- "questionship" : questionship,
- "answership" : answership,
- "stepfields" : stepfields,
- }
- return render(request, 'bakot/question.html', context)
Листинг программы
- {% block question_area %}
- {% for question in questionship %}
- <div class="small-12 medium-12 large-12 test-remark">
- <legend><strong>{{ question.title }} </strong>{{ question.question_text }}</legend>
- <ul class="menu vertical">
- {% for answer in answership %}
- <li>
- <ul class="menu test-answer-padding navigation_hover_link11">
- <li class="test-dot-padding"><input type="radio" name="{{ question.question_name }}" value="{{ answer.answer_name }}" id="pokemonRed" required></li>
- <li><label for="pokemonRed">{{ answer.choice_text }}</label>
- </ul>
- </li>
- {% endfor %}
- </ul>
- </div>
- {% endfor %}
- {% endblock %}
Решение задачи: «Как сделать каскадный вызов элементов ForeignKey в одной view в Django?»
textual
Листинг программы
- {% for question in questionship %}
- <div class="small-12 medium-12 large-12 test-remark">
- <legend><strong>{{ question.title }} </strong>{{ question.question_text }}</legend>
- <ul class="menu vertical">
- {% for answer in question.answer_set.all %}
- <li>
- <ul class="menu test-answer-padding navigation_hover_link11">
- <li class="test-dot-padding"><input type="radio" name="{{ question.question_name }}" value="{{ answer.answer_name }}" id="pokemonRed" required></li>
- <li><label for="pokemonRed">{{ answer.choice_text }}</label>
- </ul>
- </li>
- {% endfor %}
- </ul>
- </div>
- {% endfor %}
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д