首页 > 解决方案 > 如何在django中从模型类调用属性方法到html

问题描述

我正在制作一个 django 应用程序,它基本上是一个管理站点,我有一个名为计算器的应用程序,我有 3 个模型TransactionFamilyGroup并且FamilyMember每个模型都有一些用于计算目的的属性方法。以下是更清晰的模型:

class Transaction(models.Model):
    chp_reference = models.CharField(max_length=50, unique=True)
    rent_effective_date = models.DateField(null=True, blank=True)
    income_period = models.CharField(max_length=11)                                         
    property_market_rent = models.DecimalField(max_digits=7)

    @property
    def ftb_combined(self):
        ftb_combined = 0
        for family_group in self.familygroup_set.all():
            ftb_combined += family_group.ftb_combined
        return ftb_combined

class FamilyGroup(models.Model):

    name = models.CharField(max_length=10)
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
    last_rent = models.DecimalField(max_digits=7)

   @property
   def additional_child_combined(self):
       return (self.number_of_additional_children
               or 0) * self.maintenance_rate_additional_child
class FamilyMember(models.Model):
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
    family_group = models.ForeignKey(FamilyGroup, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=100, null=True, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)
    income = models.DecimalField(max_digits=6)

   @property
   def weekly_income(self):
       if self.transaction.income_period == 'Weekly':
           return self.income
       return (self.income or 0) / 2

这就是我的模型的连接方式,现在我做了一个方法views.py如下:

def transaction_print(request, transaction_id):
    transaction = Transaction.objects.get(id=transaction_id)
    
    return render(request, 'report.html', {'transaction':transaction})

我想在 中做一个报告report.html,每个交易1个报告,交易可以有很多FamilyGroups和FamilyMember,并且将包括几乎所有来自模型的数据和其中的属性方法。这里是我的想法report.html

<table class="table">

    <thead class="thead-dark">
        <tr>
            <th>CHP Reference </th>
            <th>Rent Effective From (dd/mm/yyyy)</th>
            <th>CRA Fortnightly Rates valid for 6 months from</th>
            <th>Market Rent of the Property </th>
            <th>Number of Family Groups </th>
        </tr>

    </thead>
    <tbody>
        <tr>
            <td>{{ transaction.chp_reference }} </td>
            <td>{{ transaction.rent_effective_date }} </td>
            <td>0</td>
            <td>{{ transaction.property_market_rent }}</td>
            <td>{{ transaction.number_of_family_group }}</td>

        </tr>

    </tbody>
   {% for family_group in transaction.family_group_set.all %} ??
   {% for m in family_group.transaction.family_group_set.all %} ??
</table>

我真的不知道如何执行嵌套循环来遍历FamilyGroupFamilyMember内部transaction report.html将不胜感激提示如何做到这一点。

标签: pythondjango

解决方案


根据文档, Django 将名称设置为 MODELNAME_set。但是,您仍然可以使用该related_name属性为向后引用设置名称(您仍然可以使用 MODELNAME_set)。

这是使用以下方法实现它的方法related_name

模型.py

class FamilyGroup(models.Model):

    name = models.CharField(max_length=10)
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, related_name="family_groups") # Notice the related_name here as it will be used later on
    last_rent = models.DecimalField(max_digits=7)
    # ...

class FamilyMember(models.Model):
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, related_name="family_members") # Notice the related_name
    family_group = models.ForeignKey(FamilyGroup, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=100, null=True, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)
    income = models.DecimalField(max_digits=6)
    # ...

现在你可以像这样遍历它们:

报告.html

{% for family_group in transaction.family_groups.all %}
{{ family_group.name }}
{% endfor %}

{% for family_member in transaction.family_members.all %}
{{ family_member.name }}
{% endfor %}

推荐阅读