【问题标题】:Print out forms on dashboard在仪表板上打印表格
【发布时间】:2021-10-29 11:51:30
【问题描述】:

我正在 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'))

Here my views.py: # 这里我没有使用 Forms。尝试只输出结果我的代码/

class QuizDetailView(TemplateView):
    template_name = 'quiz/quiz_detail.html'

    def get_context_data(self, **kwargs):
        quiz_id = kwargs['quiz_id']
        quiz = Quiz.objects.get(id=quiz_id)

        return {
            'quiz': quiz
        }

我想在我的模板中查看:

  • 类别
  • 测验
  • 问题
  • 回答1
  • 回答2
  • 答案3

【问题讨论】:

  • 你能分享你的看法吗?
  • 刚刚添加查看代码

标签: python django django-forms


【解决方案1】:

我假设您尝试创建一个视图,您可以在其中创建一个带有 feq 问题的新测验,对吧?

为此,通常使用 Django 的“CreateView”类。

所以在你的情况下,你会做这样的事情:

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) 相关的问题 内联 Formset(Formset,因为您可能希望每个测验的问题多于 1 )

要更新您的测验/问题,您可以使用来自 Django 的 UpdateView

如果您只想在模板中显示测验和相关问题/答案,则模板中的某些内容(假设测验实例作为测验存在):

{{ quiz.question_set.all }}

【讨论】:

    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多