python - 如何在django中从模型类调用属性方法到html
问题描述
我正在制作一个 django 应用程序,它基本上是一个管理站点,我有一个名为计算器的应用程序,我有 3 个模型Transaction
,FamilyGroup
并且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>
我真的不知道如何执行嵌套循环来遍历FamilyGroup
和FamilyMember
内部transaction
report.html
将不胜感激提示如何做到这一点。
解决方案
根据文档, 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 %}
推荐阅读
- python-3.x - 如何为 input() 提供时间窗口,如果不使用则让程序继续运行
- javascript - 在具有视差效果的滚动时在 Safari 中抖动
- docker - 如何编曲?
- c - 程序集中局部变量的大小
- git - Git文件夹被损坏
- java - 不区分大小写的 POSIX 正则表达式在 Java 模式和匹配器中不区分大小写
- swift - 选择单个视图控制器,该控制器将根据表视图控制器中选择的索引显示一定数量的 UITextField
- .net-core - 未被识别为有效的日期时间
- c++ - 有效地返回未修改的参数
- javascript - 将亵渎过滤器添加到简单的 Socket.IO 应用程序