Распечатка форм на приборной панели
Я пишу приложение 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 }}
Дайте мне знать, если у вас есть дополнительные вопросы.