首页 > 解决方案 > 在Django模板中循环时获取相关项目

问题描述

我试图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为这些人显示相关联的 s。当我遍历这些注册时 - 我正在尝试查看是否有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。

标签: djangopython-3.xdjango-modelsdjango-templates

解决方案


您错过了.all()after的输入paymentdetail_set,应该如下所示:

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

推荐阅读