正如您在模板下面所看到的,我想展示一个农夫及其相关的动物。我的模板显示了名字,姓氏和城市,正确的是,唯一缺少的是子模型中的相关动物。
在其他项目中,我不幸使用了“ {%for ParentModel.ChildModel_set.all%}”来访问子模型。
那是因为我使用了DetailView吗?
models.py
class Farmer(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
city = models.CharField(max_length=40)
objects = FarmerManager() # --- link to Manager
def __str__(self):
return self.last_name
def get_absolute_url(self):
return reverse("datainput:farmer_detail", kwargs={"id": self.id})
class Animal(models.Model):
name = models.CharField(max_length=40)
weight = models.DecimalField(max_digits=5, decimal_places=2)
species = models.ForeignKey('Species', on_delete=models.CASCADE)
farmer = models.ForeignKey('Farmer', related_name='farmername', on_delete=models.CASCADE)
objects = AnimalManager() # --- link to Manager
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("datainput:animal_detail", kwargs={"id": self.id})
views.py
class FarmerDetailView(DetailView):
template_name ="datainput/farmer_detail.html"
queryset = Farmer.objects.all()
def get_object(self):
some_id = self.kwargs.get("id")
return get_object_or_404(Farmer, id=some_id)
urls.py
<...>
path('farmer/<int:id>/', FarmerDetailView.as_view(), name='farmer_detail'),
<...>
farmer_detail.html
<...>
<div class="row" id="p1">
<div class="col-6 offset-md-3">
<p> Bauer {{ farmer.first_name }} {{ farmer.last_name }}</p> in {{ farmer.city }}
{% for animals in farmer.animal_set.all %}
<p> {{ animals }} </p>
{% endfor %}
</div>
</div>
<...>
答案 0 :(得分:2)
那是因为我使用了
DetailView
吗?
否,是因为您错误地使用了related_name
。
related_name
[Django-doc]中的ForeignKey
[Django-doc]是 reverse 中的关系的名称:
用于从相关对象到此对象的关系的名称。也是
related_query_name
的默认值(用于目标模型反向过滤器名称的名称)。
这意味着,如果Animal
具有指向Farmer
的外键,则related_name
应包含从Farmer
到其{{1}的关系的名称。 } s。 Animal
在这里不是是个好主意。
您可以将其重命名为:
farmername
然后,您可以在模板中遍历class Animal(models.Model):
# ...
farmer = models.ForeignKey('Farmer', related_name='animals', on_delete=models.CASCADE)
# ...
:
.animals
或者您可以省略,指定{% for animals in farmer.animals.all %}
<p> {{ animals }} </p>
{% endfor %}
。然后Django自动使用related_name
,因此这里是modelname_set
:
animal_set
,然后像以前一样使用class Animal(models.Model):
# ...
farmer = models.ForeignKey('Farmer', on_delete=models.CASCADE)
# ...
:
animal_set