【问题标题】:Pre-populate formset with a user saved data on revisit在重新访问时使用用户保存的数据预填充表单集
【发布时间】:2016-11-23 14:06:49
【问题描述】:

我需要使用用户保存的数据预填充表单集字段

这是我的 form.py

EssayQuestionFormSetBase = modelformset_factory(models.EssayQuestion,
                                            extra=0,
                                            fields=('prompt',),
                                             widgets={
                                                 'prompt': forms.TextInput(
                                                     attrs={'readonly': True, 'class': 'borderless'}),
                                             },
                                            )

class EssayQuestionFormSet(EssayQuestionFormSetBase):
    def add_fields(self, form, index):
        super(EssayQuestionFormSet, self).add_fields(form, index)
        form.fields['answer'] = forms.CharField(widget=forms.Textarea, label='')

如您所见,我在 EssayQuestionFormSet 中添加了一个接受答案的字段

我的 views.py 如下所示:

class QuizDetail(View):

    def get(self, request, **kwargs):

        step = models.Quiz.objects.get(pk=self.kwargs['step_pk'])

        eqs = models.EssayQuestion.objects.filter(quiz_id=self.kwargs['step_pk'])
        eqs_formset = forms.EssayQuestionFormSet(queryset=eqs, prefix='essay')

    def post(self, request, *args, **kwargs):
        step = models.Quiz.objects.get(pk=self.kwargs['step_pk'])   

        eqs = models.EssayQuestion.objects.filter(quiz_id=self.kwargs['step_pk'])
        eqs_formset = forms.EssayQuestionFormSet(request.POST, queryset=eqs, prefix='essay')


        if eqs_formset.is_valid():
            for form in eqs_formset:
                # create a NEW Answer for this form's associated question
                new_answer = models.Answer.objects.create(question=form.instance,
                                                          eq_answer_text=form.cleaned_data.get('answer'),
                                                          student=models.Student.objects.get(user=request.user.pk))                

目前,视图正确地为 get 上的答案字段呈现空的 Textarea 字段,并正确保存帖子上的答案。但是,我的问题是,如何使用用户保存的答案预先填充答案字段?

这是答案模型

class Answer(models.Model):
    date_answered = models.DateTimeField(default=timezone.now)
    student = models.ForeignKey(Student, blank=True, null=True, related_name='answers')
    question = models.ForeignKey(Question)
    eq_answer_text = models.TextField(blank=False, null=True)

【问题讨论】:

  • 我不确定表单集是否适合这里的解决方案。您不是在尝试创建或编辑论文问题,而是在尝试为每个问题创建/更新一个答案。
  • 什么是合适的解决方案?对不起,我刚开始学习 Django

标签: python django formset


【解决方案1】:

是的,您可以通过传递首字母来做到这一点。左侧值名称应该与您要在其中填充数据的表单字段相同。

initial = {
'question' :answer.question,
'answer':answer.answer,
}
form = AnswerForm(initial=initial)

【讨论】:

  • 我已经按照您的建议进行了尝试,但没有运气。由于某些原因 initial 不会作为初始形式出现,而是作为 initial_extra
  • 看起来 initial 对于模型表单集的工作方式与普通表单集的工作方式不同docs.djangoproject.com/en/1.9/topics/forms/modelforms/#id2
猜你喜欢
  • 2019-02-19
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2012-04-06
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多