Python 在Django中呈现表单列表

Python 在Django中呈现表单列表,python,django,Python,Django,我试图在Django创建一个基本的人格测试,作为工作中概念的证明。一般来说,我对Django和python都是新手,在C.NET背景下学习 我试图创建一个表单对象列表,其中包含从数据库中存储的问题对象中提取的信息,然后在HTML中显示它们 这只是部分起作用;例如,我可以通过调用question.pk在for循环中单独呈现表单属性,但是没有使用标准的Django{{form}}标记呈现任何内容,并且尝试提交表单列表会破坏整个过程 我很确定处理一个较大的html中填充的一堆表单对象是一个问题,但我不

我试图在Django创建一个基本的人格测试,作为工作中概念的证明。一般来说,我对Django和python都是新手,在C.NET背景下学习

我试图创建一个表单对象列表,其中包含从数据库中存储的问题对象中提取的信息,然后在HTML中显示它们

这只是部分起作用;例如,我可以通过调用question.pk在for循环中单独呈现表单属性,但是没有使用标准的Django{{form}}标记呈现任何内容,并且尝试提交表单列表会破坏整个过程

我很确定处理一个较大的html中填充的一堆表单对象是一个问题,但我不确定如何着手解决它

我对表单集做了一些研究,但是我找不到任何方法用数据库中的信息预填充表单项

提前谢谢

forms.py中的DISCQuestionForm:

类DISCQuestionFormforms。表单: 从数据库问题对象创建新表单对象 定义初始化__ 自己 主键, 光盘查询, 多莫回答, 输入答案, 代替回答, con_回答, : 超级__ self.pk=pk self.disc\u query=disc\u query self.dom\u answer=dom\u answer self.infl\u answer=infl\u answer self.stead\u answer=stead\u answer self.con_answer=con_answer self.disc_response=forms.DecimalField 最大值=4, widget=forms.NumberInput disc_views.py中的创建方法

为当前用户创建新的光盘评估 def disc_createrequest,主键: profile=User.objects.getpk=pk user=intprofile.pk name=profile.name rawquestionset=DISCQuestion.objects.all discformset=[] 对于问题集中的项目: 问题=DISCQuestionForm pk=item.pk, disc\u query=item.disc\u query, dom_answer=item.dom_answer, infl\u答案=item.infl\u答案, stead\u answer=item.stead\u answer, con_-answer=item.con_-answer, discformset.appendquestion 如果request.method==“POST”: questionset=discformset[request.POST] 如果questionset.u有效: dom=0 infl=0 stead=0 con=0 对于问题集中的问题: 如果discquestion.disc\u response==discquestion.dom\u回答: dom+=1 如果discquestion.disc\u response==discquestion.infl\u回答: infl+=1 如果discquestion.disc\u response==discquestion.stead\u回答: stead+=1 如果discquestion.disc\u response==discquestion.con\u回答: con+=1 disctest=disctest 用户=用户, name=name, dom=dom, infl=infl, stead=stead, con=con, disctest.save 其他: 问题集=discformset 上下文={ 主键:用户, 姓名:姓名,, discquestionset:问题集 } 返回renderrequest,disc_create.html,上下文 models.py中的DISCTest和DISCQuestion模型:

类DisctTestModels。模型: user=models.ForeignKey'user',on_delete=models.CASCADE name=user.name 已创建\u on=models.DateTimeFieldDauto\u now\u add=True dom=models.DecimalFieldmax\u位=3,小数位数=0 infl=型号。十进制字段最大位数=3,小数位数=0 stead=型号。十进制字段最大位数=3,小数位数=0 con=型号。十进制字段最大位数=3,小数位数=0 类模型。模型: disc_query=models.TextField disc\u response=models.DecimalFieldmax\u digits=1,decimal\u places=0,null=True dom\u answer=models.DecimalFieldmax\u digits=1,decimal\u places=0 infl\u answer=models.DecimalFieldmax\u digits=1,decimal\u places=0 替代答案=型号。十进制字段最大位数=1,小数位数=0 con_answer=models.DecimalFieldmax_digits=1,小数位数=0 最后是模板中的disc_create.html:

{%extends base.html%} {%block page_content%} 进行光盘评估 在此处插入说明 {%csrf_令牌%} {discquestionset%中的问题为%0} {{question.pk}}

{{question.disc_query}

{{form}} {%endfor%} 提交 {%endblock%} 您的DiscQuestionForm没有字段。disc_response被定义为表单的属性,但对于Django,它不是字段,因为它没有添加到self.fields。并且表单没有在for循环的模板中定义,只有问题是表单,所以{{question}}如果表单有任何字段,就会打印表单

但问题是你们每个人 您的问题表单字段都具有相同的名称属性,因为它们没有前缀以使其唯一

您应该仔细阅读以理解ModelForm和modelformset。基本上你需要:

class DISCQuestionForm(forms.ModelForm):
    class Meta:
        model = DISCQuestion

    def __init__(...):
        ...
使用modelformset_工厂创建适当的modelformset,您可以在提交时使用request.POST进行初始化

DISCQuestionFormSet = modelformset_factory(DISCQuestionForm, form = DISCQuestionForm)  # note DISCQuestionForm not needed if you don't customise anything in your form.
在你看来:

formset = DISCQuestFormSet(request.POST or None)
然后,您可以在模板中循环浏览表单集中的表单:

{% for form in formset %}{{ form }}{% endfor %}