TemplateSyntaxError перехватил DoesNotExist при переборе цикла forloop в заполненном списке форм - PullRequest
0 голосов
/ 02 сентября 2011

Я следил за этой полезной на вид статьей http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/. К сожалению, он не намекает на код шаблона, поэтому я догадываюсь там.

Я хочу создать кучу формна странице, чтобы добавить несколько объектов в модель с некоторыми общими свойствами, установленными другой формой, либо в переменных страницы, либо в верхней части страницы.Это для отметки учителя.

Мои 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, так как мне не удалосьPOST форму еще правильно.

Страница отображается правильно, если я положил

    else:
        aforms = [PupilAssessmentForm(prefix=str(x.id), instance=x) for x in pupils]

Но затем я связываю ModelForm из модели Assessment с объектом в модели Pupil, который кажетсянеправильно.

Мой шаблон:

{% for af in aforms %}
<form action="" method="post">
{{af.instance}}{{ af.errors }}
<p>
{{ af }}
{% endfor %}
<input type="submit" value="Submit">
</form>

Ошибка (выбранные фрагменты):

Exception Type: TemplateSyntaxError
Exception Value:    Caught DoesNotExist while rendering:

error at line 20
Caught DoesNotExist while rendering: 
20    {% for af in aforms %}

И все же список переменных появляется в переменных страницы:

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

Ответы [ 2 ]

0 голосов
/ 03 сентября 2011

Я не уверен, почему, но мне удалось это сделать, изменив список на словарь, который в любом случае отвечал моим потребностям для отображения формы в виде строки таблицы на ученика вместе с некоторыми другими оценочными данными.Мой оригинальный вопрос остается открытым для любого, кто знает альтернативный метод, который более непосредственно обращается к вопросу, который я первоначально задавал, но вот как я это сделал:

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())

Я не уверен, есть ли более элегантный способ собрать словарь, поскольку мой не особо СУХОЙ.И я понятия не имею, почему я могу распаковать словарь, содержащий форму, но не список.Был ли мой синтаксис неправильным?Во всяком случае: проблема отсортирована;рендеринг страницы.

0 голосов
/ 02 сентября 2011

Странно, django не должен выбрасывать DoesNotExist при рендеринге моделей django ... но ... вы рендерите форму.Я бы посоветовал проверить результаты в вашем коде представления, чтобы убедиться, что вы получаете результаты для учеников и других наборов запросов.

...