在Django模板中循环时获取相关项目

时间:2019-01-11 17:33:51

标签: django python-3.x django-models django-templates

我试图在循环访问PaymentDetail对象列表(_set)时访问相关对象(如果存在,则为Registrations)。

我的模型如下:

模型

class Registration(models.Model):
    person = models.ForeignKey(Person, on_delete=models.PROTECT)
    course_detail = models.ForeignKey(
        CourseDetail,
        on_delete=models.PROTECT
    )
    comments = models.CharField(max_length=200, blank=True, null=True)

    def __str__(self):
        return '%s' % (self.course_detail.course.name)    

class PaymentDetail(models.Model):
        payment = models.ForeignKey(Payment, on_delete=models.PROTECT)
        registration = models.ForeignKey(
            Registration,
            on_delete=models.PROTECT)

在我看来,我只是获得所需人员的查询集,并将其传递到模板(这些显示很好)。

视图

def index(request, **kwargs):
    people = Person.get_related_people(request.user.id).order_by('first_name')
    return render(request, 'people_app/index.html', {
        'people': people,
    })

当我在模板中遍历它们时,我正在为这些人显示关联的Registration。当我遍历这些注册时-我试图查看是否有与该PaymentDetail关联的Registration

在我的模板中,我像这样遍历registration_list

模板

{% for person in people %}
    {% for registration in person.registration_set.all %}
        {{ registration.id }} 
        {% if registration.paymentdetail_set|length > 0 %}
            PAID
        {% else %}
            NO PAYMENT
        {% endif %}
    {% endfor %}
{% endfor %}

您可能会想像-这不起作用,即使存在PaymentDetail,也始终显示为NO PAYMENT。

1 个答案:

答案 0 :(得分:1)

您错过了在.all()之后键入paymentdetail_set的情况,看起来应该像这样:

{% if registration.paymentdetail_set.all|length > 0 %}
   PAID
{% else %}
   NO PAYMENT
{% endif %}