我试图在Django创建一个基本的人格测试,作为工作中概念的证明。我对Django(以及一般的python)是新手,是在C#.NET背景下学习的。你知道吗
我试图建立一个表单对象列表(用从数据库中存储的问题对象中提取的信息填充),然后在HTML中显示它们。你知道吗
这只是部分工作;我可以在for循环中单独呈现表单属性(例如,通过调用,问题.pk)但是没有任何东西是用标准的Django{{form}}标记呈现的,尝试提交表单列表会破坏整个过程。你知道吗
我很确定处理一个较大的html中填充的一堆表单对象是一个问题,但我不确定如何着手解决它。你知道吗
我对表单集做了一些研究,但是找不到任何方法用数据库中的信息预填充表单项。你知道吗
提前谢谢!你知道吗
DISCQuestionForm输入表单.py地址:
class DISCQuestionForm(forms.Form):
# create new form object from database question object
def __init__(
self,
pk,
disc_query,
dom_answer,
infl_answer,
stead_answer,
con_answer,
):
super().__init__()
self.pk = pk
self.disc_query = disc_query
self.dom_answer = dom_answer
self.infl_answer = infl_answer
self.stead_answer = stead_answer
self.con_answer = con_answer
self.disc_response = forms.DecimalField(
max_value=4,
widget=forms.NumberInput
)
光盘创建方法视图.py你知道吗
# Create a new DISC assessment for current user
def disc_create(request, pk):
profile = User.objects.get(pk=pk)
user = int(profile.pk)
name = profile.name
rawquestionset = DISCQuestion.objects.all()
discformset = []
for item in rawquestionset:
question = DISCQuestionForm(
pk=item.pk,
disc_query=item.disc_query,
dom_answer=item.dom_answer,
infl_answer=item.infl_answer,
stead_answer=item.stead_answer,
con_answer=item.con_answer,
)
discformset.append(question)
if request.method == 'POST':
questionset = discformset[request.POST]
if questionset.is_valid():
dom = 0
infl = 0
stead = 0
con = 0
for discquestion in questionset:
if discquestion.disc_response == discquestion.dom_answer:
dom += 1
if discquestion.disc_response == discquestion.infl_answer:
infl += 1
if discquestion.disc_response == discquestion.stead_answer:
stead += 1
if discquestion.disc_response == discquestion.con_answer:
con += 1
disctest = DISCTest(
user=user,
name=name,
dom=dom,
infl=infl,
stead=stead,
con=con,
)
disctest.save()
else:
questionset = discformset
context = {
"pk": user,
"name": name,
"discquestionset": questionset
}
return render(request, "disc_create.html", context)
disc测试与disc问题模型型号.py地址:
class DISCTest(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
name = user.name
created_on = models.DateTimeField(auto_now_add=True)
dom = models.DecimalField(max_digits=3, decimal_places=0)
infl = models.DecimalField(max_digits=3, decimal_places=0)
stead = models.DecimalField(max_digits=3, decimal_places=0)
con = models.DecimalField(max_digits=3, decimal_places=0)
class DISCQuestion(models.Model):
disc_query = models.TextField()
disc_response = models.DecimalField(max_digits=1, decimal_places=0, null=True)
dom_answer = models.DecimalField(max_digits=1, decimal_places=0)
infl_answer = models.DecimalField(max_digits=1, decimal_places=0)
stead_answer = models.DecimalField(max_digits=1, decimal_places=0)
con_answer = models.DecimalField(max_digits=1, decimal_places=0)
最后是光盘_创建.html在模板中:
{% extends "base.html" %}
{% block page_content %}
<div class="col-md-8 offset-md-2">
<h1>Take your DISC assessment</h1>
<hr>
<h3>Insert instructions here</h3>
<hr>
<form action="/assessment/create/{{pk}}/" method="post">
{% csrf_token %}
<div>
{% for question in discquestionset %}
<p>{{question.pk}}</p>
<p>{{ question.disc_query }}</p>
{{ form }}
{% endfor %}
</div>
<button type="submit">Submit</button>
</form>
</div>
{% endblock %}
您的
DiscQuestionForm
没有字段。disc_response
被定义为表单的属性,但对于Django,它不是字段,因为它没有添加到self.fields
。并且form
没有在for循环的模板中定义,只有question
(这是表单),所以{{ question }}
会打印表单(如果它有任何字段)。你知道吗但是问题是,每个
question
表单字段都具有相同的“name”属性,因为它们没有前缀以使其唯一。你知道吗你应该仔细阅读this document来理解
ModelForm
和modelformset
。基本上你需要:使用
modelformset_factory
创建一个合适的ModelFormSet
,提交时可以用request.POST
初始化。你知道吗在你看来:
然后在模板中,您可以循环浏览表单集中的表单:
相关问题 更多 >
编程相关推荐