Django 具有两个外键的模型的内联形式集问题
我正在为InlineFormset做一些努力。我正在为我的学生编写一个数据库应用程序,我有两个主要课程:学生(姓、名、电子邮件地址等)和模块(标题、代码、评估名称等)。然后,我有一个第三个类,可以保存每个学生在他/她所在的每个模块中的表现(学生和模块一起定义为唯一): 在模型中,我有一个保存平均值的函数(评估值可以在模块类中定义,例如,论文价值40%,考试价值60%) 我正在努力的是制作一个表单集来编辑模块的所有特定标记。我现在的做法是在forms.py中生成一个form类,其中包含一个函数,可以设置一些参数(该模块有多少个评估,哪些评估应该有一个“bootstrapuneditable”小部件)。这听起来有点奇怪,但在Django的旧版本中,一个bug阻止了“widgets”作为参数传递给ModelFormset,如果我选择的webhoster(待定)没有运行最新版本,我不想冒险重写它 然后我使用该form类生成一个inlineformset:Django 具有两个外键的模型的内联形式集问题,django,django-models,django-forms,Django,Django Models,Django Forms,我正在为InlineFormset做一些努力。我正在为我的学生编写一个数据库应用程序,我有两个主要课程:学生(姓、名、电子邮件地址等)和模块(标题、代码、评估名称等)。然后,我有一个第三个类,可以保存每个学生在他/她所在的每个模块中的表现(学生和模块一起定义为唯一): 在模型中,我有一个保存平均值的函数(评估值可以在模块类中定义,例如,论文价值40%,考试价值60%) 我正在努力的是制作一个表单集来编辑模块的所有特定标记。我现在的做法是在forms.py中生成一个form类,其中包含一个函数,可
form = generate_mark_form(no_of_assessments, noexam, assessment_to_change)
MarkFormSet = inlineformset_factory(Module, Performance, form=form)
然后,我在views.py中以正常方式使用此MarkFormSet:
if request.method == 'POST':
formset = MarkFormSet(request.POST, instance=module)
if formset.is_valid():
instances = formset.save(commit=False)
for instance in instances:
instance.save_with_avg()
return HttpResponseRedirect(module.get_absolute_url())
else:
formset = MarkFormSet(instance=module)
return render_to_response(...)
然后,模板在表中使用formset:
<form action = "{{ action_url }}", method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
<tr>
<td>
{{ form.student }}
</td>
{% if current_module.assessment_1_title %}
<td>
{{ form.assessment_1 }}
</td>
{% endif %}
{% if current_module.assessment_2_title %}
<td>
{{ form.assessment_2 }}
</td>
{% endif %}
{% if current_module.assessment_3_title %}
<td>
{{ form.assessment_3 }}
</td>
{% endif %}
{% if current_module.exam_value %}
<td>
{{ form.exam }}
</td>
{% endif %}
<td>
{{ form.average.value }}
</td>
</td>
{% endfor %}
{%csrf_令牌%}
{{formset.management_form}
{formset%中表单的%s}
{{form.student}}
{%if当前_module.assessment_1_title%}
{{form.assessment_1}}
{%endif%}
{%if当前_module.assessment_2_title%}
{{form.assessment_2}}
{%endif%}
{%if当前_module.assessment_3_title%}
{{form.assessment_3}}
{%endif%}
{%if当前_module.exam_值%}
{{form.exam}
{%endif%}
{{form.average.value}
{%endfor%}
除了两件事外,一切看起来都很好:
\uuuuuunicode\uuuuu
中所设置),但显示为下拉菜单。如果我将它们设置为不可编辑,或者改用form.student.value,我只会在HTML中获得(没有帮助的)id号。在没有下拉菜单的情况下,如何获得\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数的结果谢谢 对不起-我不想在这里写太多,我认为这已经足够长了。。。models.py中的模块代码非常简单,只有标题、代码(id)、年份等字段,它有三个字段用于评估标题(如“演示文稿”或“论文”)和值(如40%)。谢谢你看!不需要道歉-我的错。。。该模型有“评估题”和“评估值”——我之所以在模板中使用if子句,是因为并非每个模块都必须有3个评估和一次考试。因此,如果“评估3”标题没有附加值,则不需要表列。Performance类有带标记的“assessment_1”等。根据我在代码中的理解,forloop从“0”开始循环表单集,这就是为什么会得到“MultiValueDictKeyError:”Key“Performance_set-0-id”。我没有解决这个问题的办法,我以前也遇到过这个问题,我承认我没有解决我的问题。所以我试着用另一种方式得到我需要的东西。为什么不在模板中使用jquery或javascript计算评估呢。
form = generate_mark_form(no_of_assessments, noexam, assessment_to_change)
MarkFormSet = inlineformset_factory(Module, Performance, form=form)
if request.method == 'POST':
formset = MarkFormSet(request.POST, instance=module)
if formset.is_valid():
instances = formset.save(commit=False)
for instance in instances:
instance.save_with_avg()
return HttpResponseRedirect(module.get_absolute_url())
else:
formset = MarkFormSet(instance=module)
return render_to_response(...)
<form action = "{{ action_url }}", method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
<tr>
<td>
{{ form.student }}
</td>
{% if current_module.assessment_1_title %}
<td>
{{ form.assessment_1 }}
</td>
{% endif %}
{% if current_module.assessment_2_title %}
<td>
{{ form.assessment_2 }}
</td>
{% endif %}
{% if current_module.assessment_3_title %}
<td>
{{ form.assessment_3 }}
</td>
{% endif %}
{% if current_module.exam_value %}
<td>
{{ form.exam }}
</td>
{% endif %}
<td>
{{ form.average.value }}
</td>
</td>
{% endfor %}