与django内联formset又一次斗争

时间:2015-07-08 01:34:18

标签: django python-2.7 django-models django-forms inline-formset

好的,在花了8个小时的搜索和阅读后,我觉得是时候问了。我正在创建一个练习django的学校应用程序,我被困在评分部分。我有一个“Matricula”模型,它关联学生和一个班级,以及一个“Parcial”模型,它定义了活动中的一段时间。此外,还有一个“等级”模型创建了一个要评分的任务,由“Parcial”和“Class”定义,还有一个“Student_Grade”模型,它实际上将“Grade”,“Matricula”和数值(此模型旨在为每个学生分配成绩)。

以下是该方案:

型号:

class Grade(models.Model):

    parcial = models.ForeignKey("configuracion_sam.Estructura_Subperiodo")
    materia = models.ForeignKey("configuracion_sam.Materia")
    type = models.ForeignKey("Grade_Type")

    def __unicode__(self):
        return self.parcial.name + " " + self.materia.nombre + " " + self.materia.clase.clase_name


class Student_Grade(models.Model):
    assignment = models.ForeignKey("Grade")
    student = models.ForeignKey("configuracion_sam.Matricula")
    grade = models.FloatField()

    def __unicode__(self):
        return self.assignment.materia.nombre+" "+self.student.estudiante.usuario.name

查看:

def create_grade(request, grade_id):
    grade = Grade.objects.get(pk = grade_id)
    students = Matricula.objects.filter(clase__id = grade.materia.clase_id).order_by("estudiante__usuario__last_name")
    Student_Grade_FormSet = inlineformset_factory(Grade, Student_Grade, extra = len(students))
    context = RequestContext(request)
    formset = Student_Grade_FormSet(instance = grade, initial = students.values())
    if request.method == "POST":
        formset = Student_Grade_FormSet(request.POST, instance = grade)
        if formset.is_valid():
            formset.save()

            return redirect("/faltas/disciplina/")
        else:
            for form in formset:
                print form.errors
                return render_to_response("academic_office_sam/students_grades",
                              {"students":students, "formset":formset},
                              context)

    else:
        return render_to_response("academic_office_sam/students_grades",
                              {"students":students, "formset": formset},
                              context)

请注意我在视图中如何使用内联表单集,以便通过分配特定的“成绩”实例,我可以同时为多个学生创建多个注册表。在这种情况下,我设置额外= len(学生)来创建一些表格,这些表格对应于在“同一级别”相关的同一班级注册的学生人数。

现在的问题是:如何为每个学生设置Student_Grade表单上的“Matricula”字段的初始值,从而导致查询“学生”?我试过了:

initial = students
initial = students.values()
queryset = students
queryset = students.values()

没有成功。也许它不起作用,因为“matricula”模型没有在formset中声明?我读过一些关于初始参数的内容,只适用于“额外”表单,但我无法管理它以显示。

提前感谢您花时间阅读本文,并在可以的情况下提供帮助!

罗德里戈

1 个答案:

答案 0 :(得分:0)

Student_Grade_FormSet = inlineformset_factory(Grade, Student_Grade, extra=len(students))

if request.POST:
    formset = Student_Grade_FormSet(request.POST)
    if formset.is_valid():
        formset.instance = grade
        formset.save()
else:
    formset = Student_Grade_FormSet()

    for inline_form, data in zip(formset.forms, students.values('pk')):
        inline_form.initial = {'student': data}