Django TemplateSyntaxError在遍历填充的表单列表上的forloop时捕获了DoesNotExist

Django TemplateSyntaxError在遍历填充的表单列表上的forloop时捕获了DoesNotExist,django,django-templates,django-forms,Django,Django Templates,Django Forms,我一直在关注这篇有用的文章。不幸的是,他没有暗示模板代码,所以我猜是这样的 我想在一个页面中创建一组表单,将多个对象添加到一个模型中,并在页面的变量或页面顶部由另一个表单设置一些公共属性。这是老师的成绩表 My views.py: def record_assessments(request, teachinggroup, objective): theclass = TeachingGroup.objects.get(name__iexact = teachinggroup)

我一直在关注这篇有用的文章。不幸的是,他没有暗示模板代码,所以我猜是这样的

我想在一个页面中创建一组表单,将多个对象添加到一个模型中,并在页面的变量或页面顶部由另一个表单设置一些公共属性。这是老师的成绩表

My views.py:

def record_assessments(request, teachinggroup, objective):
    theclass = TeachingGroup.objects.get(name__iexact = teachinggroup)
    pupils = Pupil.objects.filter(teaching_group = theclass)
    theobjective = Objective.objects.get(code = objective)
    thedate = datetime.date.today()

    if request.method == 'POST':
        aforms = [PupilAssessmentForm(request.POST, prefix=x.id, instance=Assessment()) for x in pupils]
        if all(af.is_valid() for af in aforms):
            for af in aforms:
                new_record = af.save(commit = False)
                new_record.objective = theobjective
                new_record.date = thedate
                new_record.save()
            return redirect("/app/" + theclass + "/" + marksheet + "/" + theobjective.strand.code|lower + "/")
    else:
        aforms = [PupilAssessmentForm(prefix=str(x.id)) for x in pupils]
    return render_to_response('recordassessments.html', locals())
我还没有检查第一个if循环中的逻辑,因为我还没有正确地发布表单

如果我将

    else:
        aforms = [PupilAssessmentForm(prefix=str(x.id), instance=x) for x in pupils]
但是我将评估模型中的一个模型表单绑定到学生模型中的一个对象,这似乎是错误的

我的模板:

{% for af in aforms %}
<form action="" method="post">
{{af.instance}}{{ af.errors }}
<p>
{{ af }}
{% endfor %}
<input type="submit" value="Submit">
</form>
然而,aforms列表出现在页面变量中:

aforms  
[<two.app.forms.PupilAssessmentForm object at 0x21db0d0>,
 <two.app.forms.PupilAssessmentForm object at 0x21db650>]

奇怪的是,django在渲染django模型时不应该抛出DoesNotExist。。。但是您正在呈现一个窗体。我的建议是在视图代码中检查结果,以确保在学生和其他查询集中得到结果

我不知道为什么,但我通过将列表更改为字典成功地做到了这一点,这符合我的需要,可以将表格显示为每个学生的表格行以及其他一些评估数据。我最初的问题对任何知道更直接地解决我最初提出的问题的替代方法的人来说都是开放的,但我是这样做的:

views.py相关位:

    if request.method == 'POST':
        assessment_grid = {}
        for x in pupils:
            form = PupilAssessmentForm(request.POST, prefix=str(x.id))
            try:
                assessment = Assessment.objects.filter(objective = theobjective).filter(pupil = x).filter(date__lte = thedate).latest('date')
            except Assessment.DoesNotExist:
                assessment = None
            pupil_row = [assessment, form]
            assessment_grid[x] = pupil_row
        if all(pupil_row[1].is_valid() for pupil, pupil_row in assessment_grid.items()):
            for pupil, pupil_row in assessment_grid.items():
                new_record = pupil_row[1].save(commit = False)
                new_record.objective = theobjective
                new_record.date = thedate
                new_record.teacher = theclass.teacher
                new_record.pupil = pupil
                new_record.save()
            return redirect("some link")
     else:
        assessment_grid = {}
        for x in pupils:
            form = PupilAssessmentForm(prefix=str(x.id))
            try:
                assessment = Assessment.objects.filter(objective = theobjective).filter(pupil = x).filter(date__lte = thedate).latest('date')
            except Assessment.DoesNotExist:
                assessment = None
            pupil_row = [assessment, form]
            assessment_grid[x] = pupil_row
    return render_to_response('recordassessments.html', locals())

我不确定是否有更优雅的方法来组装这本字典,因为我的字典并不特别干燥。我不知道为什么我可以打开一个包含表单的字典,而不是一个列表。我的语法错了吗?无论如何:问题排序;页面呈现。

这是一篇非常古老的文章,可能是在我们之前写的。你应该用这些。谢谢,我已经玩过了,但是我不认为表单集可以做我想要的。除非我非常愚蠢,这是可能的。我想对学生进行迭代,获取每个学生以前的评估数据以显示在相邻的表单元格中,然后呈现一个表单字段,该字段将为该学生添加一条记录,或者更新一条记录(如果存在)。在我看来,表单集似乎是用于全新的对象—直接的表单集,或者用于在更新模型表单集的模型中迭代对象。是否可以迭代一个模型,但在另一个评估中添加/更新记录?
    if request.method == 'POST':
        assessment_grid = {}
        for x in pupils:
            form = PupilAssessmentForm(request.POST, prefix=str(x.id))
            try:
                assessment = Assessment.objects.filter(objective = theobjective).filter(pupil = x).filter(date__lte = thedate).latest('date')
            except Assessment.DoesNotExist:
                assessment = None
            pupil_row = [assessment, form]
            assessment_grid[x] = pupil_row
        if all(pupil_row[1].is_valid() for pupil, pupil_row in assessment_grid.items()):
            for pupil, pupil_row in assessment_grid.items():
                new_record = pupil_row[1].save(commit = False)
                new_record.objective = theobjective
                new_record.date = thedate
                new_record.teacher = theclass.teacher
                new_record.pupil = pupil
                new_record.save()
            return redirect("some link")
     else:
        assessment_grid = {}
        for x in pupils:
            form = PupilAssessmentForm(prefix=str(x.id))
            try:
                assessment = Assessment.objects.filter(objective = theobjective).filter(pupil = x).filter(date__lte = thedate).latest('date')
            except Assessment.DoesNotExist:
                assessment = None
            pupil_row = [assessment, form]
            assessment_grid[x] = pupil_row
    return render_to_response('recordassessments.html', locals())