Django 从 Parent object 访问模板中的 Child 数据
Django Accessing Child Data in Templates from Parent object
我是 Django 的新手,我正在尝试做一些应该非常简单的事情(在我看来),但我已经花了几个小时,但还没有解决它。
目标:在模板中,我想使用 parent 从 child object 的字段中获取值。在这种情况下,我试图通过了解 parent sample
.
来获得 lab_request
object
到目前为止,我已经尝试在 Lab_Request
模型中使用 ForeignKey
以及 OneToOneField
我认为我出错的代码中的特定区域是 {{ sample.lab_request.placeholder_to_be_replaced }}
。 Sample
是 parent,'Lab_Requests' 是 child。在这种情况下,我已将它设置为 OneToOneField 但实际上我在另一个区域遇到了这个问题,它将是 Parent 到多个 Children.
代码:
#models.py
class Sample(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
status = models.CharField(max_length=2, choices=SAMPLE_STATUS_OPTIONS, default="01")
sample_number = models.CharField(max_length=19, unique=True, editable=False, default=get_sample_number)
class Inspection_Request(models.Model):
#Add stuff here
placeholder_to_be_replaced = models.CharField(max_length=1)
sample = models.OneToOneField(Sample, on_delete=models.CASCADE)
inspector = models.OneToOneField(Inspector, on_delete=models.CASCADE, null=True, blank=True)
class Lab_Request(models.Model):
#Add stuff here
placeholder_to_be_replaced = models.CharField(max_length=1)
sample = models.OneToOneField(Sample, on_delete=models.CASCADE)
inspector = models.OneToOneField(Inspector, on_delete=models.CASCADE, null=True, blank=True)
#views.py
class SampleHomeView(ListView):
model = Sample
samples = Sample.objects.all
context_object_name = 'samples'
template_name = '<app name>/sample.html'
ordering = ['-sample_date']
paginate_by = 10
#sample.html
{% extends 'base.html' %}
{% block content %}
{% load custom_tags %}
{% load define_action %}
<h1>Sample Status</h1>
#other stuff that doesn't matter
{% for sample in samples %}
{% if user.profile.employee.pk == sample.inspector.employee.pk or perms.ics.view_sample %}
<tr>
<td class="column1">{{ sample.sample_date }}</td>
<td class="column2">{{ sample.status|sample_status_options }}</td>
<td class="column3"><a href="#">{{ sample.sample_number }}</a></td>
<td class="column4"><a href="#">{{ sample.order.customer.customer_name }}</a></td>
<td class="column5"><a href="#">{{ sample.lab_request.placeholder_to_be_replaced }}{{ sample.lab_request.lab.lab_name }}{{ sample.inspection_request.inspector.employee.employee_first_name }}</a></td>
<td class="column6">{{ sample.date_modified|date:'F d, Y' }}</td>
</tr>
{% endif %}
{% endfor %}
#more stuff that doesn't matter
{% block table %}
{% endblock table %}
{% endblock content %}
如有任何指导,我们将不胜感激。
好的,我明白了。我需要将 child 调用为 parent 与我所做的略有不同。我需要使用 {{ sample.lab_request_set.all.0.lab }} 而不是 {{ sample.lab_request.lab }}
对于将来需要此功能的任何人,如果您没有在 ForeignKey 中设置相关名称,那么它将是 parent_model_name.child_model_name_set.all 这将为您提供一个查询集,您可以循环访问该查询集,或者只是 select 第一个就像我在 .all 末尾使用 .0 所做的那样。这适用于模板。如果您在 python 文件中需要它,那么您将使用 parent_model_name.child_model_name_set.all()
调用该函数
我是 Django 的新手,我正在尝试做一些应该非常简单的事情(在我看来),但我已经花了几个小时,但还没有解决它。
目标:在模板中,我想使用 parent 从 child object 的字段中获取值。在这种情况下,我试图通过了解 parent sample
.
lab_request
object
到目前为止,我已经尝试在 Lab_Request
模型中使用 ForeignKey
以及 OneToOneField
我认为我出错的代码中的特定区域是 {{ sample.lab_request.placeholder_to_be_replaced }}
。 Sample
是 parent,'Lab_Requests' 是 child。在这种情况下,我已将它设置为 OneToOneField 但实际上我在另一个区域遇到了这个问题,它将是 Parent 到多个 Children.
代码:
#models.py
class Sample(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
status = models.CharField(max_length=2, choices=SAMPLE_STATUS_OPTIONS, default="01")
sample_number = models.CharField(max_length=19, unique=True, editable=False, default=get_sample_number)
class Inspection_Request(models.Model):
#Add stuff here
placeholder_to_be_replaced = models.CharField(max_length=1)
sample = models.OneToOneField(Sample, on_delete=models.CASCADE)
inspector = models.OneToOneField(Inspector, on_delete=models.CASCADE, null=True, blank=True)
class Lab_Request(models.Model):
#Add stuff here
placeholder_to_be_replaced = models.CharField(max_length=1)
sample = models.OneToOneField(Sample, on_delete=models.CASCADE)
inspector = models.OneToOneField(Inspector, on_delete=models.CASCADE, null=True, blank=True)
#views.py
class SampleHomeView(ListView):
model = Sample
samples = Sample.objects.all
context_object_name = 'samples'
template_name = '<app name>/sample.html'
ordering = ['-sample_date']
paginate_by = 10
#sample.html
{% extends 'base.html' %}
{% block content %}
{% load custom_tags %}
{% load define_action %}
<h1>Sample Status</h1>
#other stuff that doesn't matter
{% for sample in samples %}
{% if user.profile.employee.pk == sample.inspector.employee.pk or perms.ics.view_sample %}
<tr>
<td class="column1">{{ sample.sample_date }}</td>
<td class="column2">{{ sample.status|sample_status_options }}</td>
<td class="column3"><a href="#">{{ sample.sample_number }}</a></td>
<td class="column4"><a href="#">{{ sample.order.customer.customer_name }}</a></td>
<td class="column5"><a href="#">{{ sample.lab_request.placeholder_to_be_replaced }}{{ sample.lab_request.lab.lab_name }}{{ sample.inspection_request.inspector.employee.employee_first_name }}</a></td>
<td class="column6">{{ sample.date_modified|date:'F d, Y' }}</td>
</tr>
{% endif %}
{% endfor %}
#more stuff that doesn't matter
{% block table %}
{% endblock table %}
{% endblock content %}
如有任何指导,我们将不胜感激。
好的,我明白了。我需要将 child 调用为 parent 与我所做的略有不同。我需要使用 {{ sample.lab_request_set.all.0.lab }} 而不是 {{ sample.lab_request.lab }}
对于将来需要此功能的任何人,如果您没有在 ForeignKey 中设置相关名称,那么它将是 parent_model_name.child_model_name_set.all 这将为您提供一个查询集,您可以循环访问该查询集,或者只是 select 第一个就像我在 .all 末尾使用 .0 所做的那样。这适用于模板。如果您在 python 文件中需要它,那么您将使用 parent_model_name.child_model_name_set.all()
调用该函数