【问题标题】:Accessing Child model via DetailView?通过 DetailView 访问子模型?
【发布时间】:2019-10-29 09:37:55
【问题描述】:

我有两个模型 Farmer 和 Animals。 Animal(s) 通过 ForeignKey 与 Farmer(s) 相关联。

正如您在模板中看到的,我想展示一个农民和他的相关动物。我的模板显示 first_name、last_name 和 city,正确地唯一缺少的是子模型中的相关动物。

在其他项目中,我使用“{% for item in 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>
<...>   

【问题讨论】:

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


    【解决方案1】:

    是因为我使用了DetailView吗?

    不是,是因为你用错了related_name

    ForeignKey [Django-doc]related_name [Django-doc]reverse 中关系的名称:

    用于从相关对象到此对象的关系的名称。它也是related_query_name 的默认值(用于目标模型的反向过滤器名称)。

    这意味着如果Animal 具有到Farmer 的外键,则related_name 应该包含从Farmer 到其Animals 的关系名称。 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 %}

    或者您可以省略指定related_name。 Django然后自动使用<i>modelname</i>_set,所以这里是animal_set

    class Animal(models.Model):
        # ...
        farmer = models.ForeignKey('Farmer', on_delete=models.CASCADE)
        # ...

    然后像以前一样使用animal_set

    {% for animals in farmer.animal_set.all %}
    <p>  {{ animals }} </p>
    {% endfor %}

    【讨论】:

    • 好的,我会检查我的整个项目。我使用“farmername”作为“related_name”并更改它。到目前为止,它适用于“farmername.all”。我想我会在我的 django 笔记上留下一个重要的标记,所以下次我不会错过它。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多