Как сделать каскадный вызов элементов ForeignKey в одной view в Django? - Python

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Как сделать каскадный вызов элементов ForeignKey в одной view в Django?»

textual
Листинг программы
  1. {% for question in questionship %}
  2.   <div class="small-12 medium-12 large-12 test-remark">
  3.     <legend><strong>{{ question.title }} </strong>{{ question.question_text }}</legend>
  4.  
  5.       <ul class="menu vertical">
  6.  
  7.         {% for answer in question.answer_set.all %}
  8.         <li>
  9.           <ul class="menu test-answer-padding navigation_hover_link11">
  10.             <li class="test-dot-padding"><input type="radio" name="{{ question.question_name }}" value="{{ answer.answer_name }}" id="pokemonRed" required></li>
  11.             <li><label for="pokemonRed">{{ answer.choice_text }}</label>
  12.           </ul>
  13.         </li>
  14.         {% endfor %}
  15.       </ul>
  16.   </div>
  17. {% endfor %}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы