Доступ к дочерней модели через DetailView? - PullRequest
1 голос
/ 14 июня 2019

У меня есть две модели Фермер и Животные. Животные связаны с Фермером через ForeignKey.

Как вы видите ниже в шаблоне, я хочу показать фермера и его родственных животных. Мой шаблон отображает имя, фамилию и город, правильно не хватает только связанных животных из дочерней модели.

В других проектах я использовал "{% для элемента в 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 Ответ

2 голосов
/ 14 июня 2019

Это потому, что я использовал DetailView?

Нет , это потому, что вы использовали related_name неправильный путь.

related_name [Django-doc] из ForeignKey [Django-doc] - это имя отношенияin reverse :

Имя, используемое для отношения от связанного объекта к этому .Это также значение по умолчанию для related_query_name (имя, которое будет использоваться для имени обратного фильтра из целевой модели).

Это означает, что если Animal имеет внешний ключ для Farmerrelated_name должно содержать имя отношения от Farmer до Animal с.farmername это не хорошая идея здесь.

Вы можете переименовать это как:

class Animal(models.Model):
    # ...
    farmer = models.ForeignKey('Farmer'<b>, related_name='animals'</b>, on_delete=models.CASCADE)
    # ...

В своем шаблоне вы можете затем выполнить итерацию по .animals:

{% for animals in farmer.<b>animals.all</b> %}
<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.<b>animal_set</b>.all %}
<p>  {{ animals }} </p>
{% endfor %}
...