首页 文章

在Django中获取模型formset中的数据

提问于
浏览
1

我在Django中有一个formset .

我在模板中打印此formset为

{% for form in formset %}
    {{ form.name }}
{% endfor %}

formset由作为表单的查询集和一些额外的表单组成 . 但我需要查询集中的一些字段值,我不会将其显示为表单 . 这怎么可能?它是一个带有 prefetch_related 的查询集,因此字段实际上不在模型中,而是在我的查询集中连接 .

我的模特是

class Person:
    name = CharField(max_length=200)

class Grade:
    person = ForeignKey(Person)
    grade = IntegerField()

我的查询集是 Person.objects.prefetch_related('grade_set') .

我的模板是

{% for form in formset %}
    Object id: {{ obj.id }}
    {{ form.name }}
    {{ obj.grade_set.all|running_total }}
{% endfor %}

我知道 obj 没有定义,但我认为可能在模板中做这样的事情:

{% for obj, form in object_formset %}
    Object id: {{ obj.id }}
    {{ form.name }}
    {{ obj.grade_set.all|running_total }}
{% endfor %}

现在我的formset只包含表单,但我更需要一个对象列表,并从这个对象列表中创建一些表单 . 我可以通过创建表单并使用字段名称和输入名称来完成一个小小的黑客,并完全避免Django创建表单的方式,但我认为这将是愚蠢的 . 必须有其他方式 .

1 回答

  • 2

    是的,这可以使用zip .

    # somewhere in views.py...
    people = Person.objects.prefetch_related('grade_set')
    formset = # ...(create your modelformset)...
    people_and_formset = zip(people, formset)
    
    # somewhere in template.html...
    {% for person, form in people_and_formset %}
        {{ person.id }}
        {{ form.name }}
        {{ person.grade_set.all|running_total }}
    {% endfor %}
    

    使用prefetch_related后,每个 Persongrade_set 将在Queryset缓存中找到,并且不需要再次命中数据库 .

相关问题