通过DetailView访问子模型?

时间:2019-06-14 18:26:17

标签: django django-models django-templates django-views

我有农夫和动物两个模型。动物通过ForeignKey与农民相关。

正如您在模板下面所看到的,我想展示一个农夫及其相关的动物。我的模板显示了名字,姓氏和城市,正确的是,唯一缺少的是子模型中的相关动物。

在其他项目中,我不幸使用了“ {%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>
<...>   

1 个答案:

答案 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