Распечатка форм на приборной панели

Я пишу приложение Quiz на Dajngo. У меня есть model.py:

class Quiz(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='quizzes')
    name = models.CharField(max_length=200, verbose_name=_('Quiz name'))
    description = models.CharField(max_length=100, verbose_name=_('Description'))
    slug = models.SlugField(blank=True)
    roll_out = models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['timestamp']
        verbose_name = _('Quiz')
        verbose_name_plural = _('Quizzes')

    def __str__(self):
        return self.name


class Question(models.Model):
    quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='questions')
    label = models.CharField(max_length=255, verbose_name=_('Question text'))
    order = models.IntegerField(default=0, verbose_name=_('Order'))

    class Meta:
        verbose_name = _('Question')
        verbose_name_plural = _('Questions')

    def __str__(self):
        return self.label


class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
    label = models.TextField(max_length=600, verbose_name=_('Answer text'))
    is_correct = models.BooleanField(default=False, verbose_name=_('Correct answer'))

    class Meta:
        verbose_name = _('Answer')
        verbose_name_plural = _('Answers')

    def __str__(self):
        return self.label

И я запутался в том, как выводить формы для создания викторины с вопросами.

Это мой forms.py:

class QuizAddForm(forms.ModelForm):
    class Meta:
        model = Answer
        exclude = ('question',)

    def __init__(self, *args, **kwargs):
        quiz = kwargs.pop('quiz', '')
        super(QuizAddForm, self).__init__(*args, **kwargs)
        self.fields['question'] = forms.ModelChoiceField(queryset=Quiz.objects.filter(name='category'))

Я хочу, чтобы в моем шаблоне был такой вид:

  • Категория
  • Вопрос
  • Вопрос
  • Ответ 1
  • Ответ 2
  • Ответ 3
  • и т.д.

Я предполагаю, что вы пытаетесь создать представление, в котором вы можете создать новый тест с несколькими вопросами, верно?

Для этого обычно используется класс ´CreateView´ из Django.

Так что в вашем случае вы бы сделали что-то вроде:

Questionform = inlineformset_factory(Quiz, Question,
                                     form=QuestionForm,  # you need to define 
                                     formset=QuestionFormset, # you need to define this
                                     can_delete=True,
                                     extra=5)

class QuizCreateView(CreateView):
    form_class = QuizForm
    model = Quiz
    prefix = 'quiz'
    template_name = 'quiz/quiz_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['questionform'] = Questionform(**self.get_questionform_kwargs(form_name='question'))
        return context

    def get_questionform_kwargs(self, form_name):
        form_kwargs = {
            'prefix': form_name
        }

        if self.request.method in ('POST', 'PUT'):
            form_kwargs.update({
                'data': self.request.POST,
                'files': self.request.FILES,
        })
        return form_kwargs

    def form_valid(self, form):
        context = self.get_context_data()
        questionform = context['questionform']
        
        if questionform.is_valid():
            self.object = form.save()
            questionform.instance = self.object
            questionform.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.form_invalid(form, **{'questioform': questionform})

    def form_invalid(self, form, **kwargs):
        context = self.get_context_data()
        context['form'] = form
        for key, value in kwargs.items():
            context[key] = value
        return self.render_to_response(context=context)

На самом деле суть в том, что вы хотите показать 2 формы: 1) форму викторины и 2) форму связанного вопроса Inline (форму, потому что вы, вероятно, хотите иметь больше вопросов в викторине, чем 1)

Надеюсь, это поможет. Для обновления викторины / вопроса вы можете использовать UpdateView из Django.

Если вы хотите показывать в шаблоне только викторину и связанные с ней вопросы/ответы, то что-то в шаблоне (при условии, что экземпляр викторины присутствует как quiz):

{{ quiz.question_set.all }}

Дайте мне знать, если у вас есть дополнительные вопросы.

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