Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 具有两个外键的模型的内联形式集问题_Django_Django Models_Django Forms - Fatal编程技术网

Django 具有两个外键的模型的内联形式集问题

Django 具有两个外键的模型的内联形式集问题,django,django-models,django-forms,Django,Django Models,Django Forms,我正在为InlineFormset做一些努力。我正在为我的学生编写一个数据库应用程序,我有两个主要课程:学生(姓、名、电子邮件地址等)和模块(标题、代码、评估名称等)。然后,我有一个第三个类,可以保存每个学生在他/她所在的每个模块中的表现(学生和模块一起定义为唯一): 在模型中,我有一个保存平均值的函数(评估值可以在模块类中定义,例如,论文价值40%,考试价值60%) 我正在努力的是制作一个表单集来编辑模块的所有特定标记。我现在的做法是在forms.py中生成一个form类,其中包含一个函数,可

我正在为InlineFormset做一些努力。我正在为我的学生编写一个数据库应用程序,我有两个主要课程:学生(姓、名、电子邮件地址等)和模块(标题、代码、评估名称等)。然后,我有一个第三个类,可以保存每个学生在他/她所在的每个模块中的表现(学生和模块一起定义为唯一):

在模型中,我有一个保存平均值的函数(评估值可以在模块类中定义,例如,论文价值40%,考试价值60%)

我正在努力的是制作一个表单集来编辑模块的所有特定标记。我现在的做法是在forms.py中生成一个form类,其中包含一个函数,可以设置一些参数(该模块有多少个评估,哪些评估应该有一个“bootstrapuneditable”小部件)。这听起来有点奇怪,但在Django的旧版本中,一个bug阻止了“widgets”作为参数传递给ModelFormset,如果我选择的webhoster(待定)没有运行最新版本,我不想冒险重写它

然后我使用该form类生成一个inlineformset:

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
    函数的结果

  • 当我现在点击“提交”时,我得到一个“MultiValueDictKeyError:”在中找不到键'performance\u set-0-id'
  • 很抱歉我发了这么长的帖子,我一直在寻找解决方案,所以如果有人能在这里指出我的错误,那就太好了


    谢谢

    对不起-我不想在这里写太多,我认为这已经足够长了。。。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 %}