Django получает дочерние элементы родительского элемента на странице сведений о родителе

#python #django #view #model

#python #django #Вид #Модель

Вопрос:

Я пытаюсь получить доступ к дочерним элементам модели и перечислить их на странице сведений о родителях. Вот как я это настроил…

Модели:

 class Destination(models.Model):
      title = models.CharField( null=True, max_length=60, blank=True)
      featuredimage = models.ImageField(null=True, blank=True, upload_to ='media/')
      location = PlainLocationField(based_fields=['title'], zoom=7, null=True, blank=True)

class Airport(models.Model):
      title = models.CharField( null=True, max_length=60, blank=True)
      city = models.ForeignKey(Destination, null=True, blank=True, on_delete=models.SET_NULL)
 

Число просмотров:

 def destination_detail(request, slug):
    destination = Destination.objects.get(slug=slug)
    context = {
    'destination': destination,
    'airport': Airport.objects.filter(city = destination.id),
    }
    return render(request,"destination/detail.html",context)
 

Шаблон:

 <h1>
    {{ airport.title }}
</h1>
 

Он не выдает ошибку или что-то еще, но ничего не отображается. У меня все импортировано и настроено правильно, я думаю, мне просто не хватает того, как правильно настроить его в моих представлениях. Любая информация будет с благодарностью принята.

Ответ №1:

У вас Airport.objects.filter(city=destination.id) есть Queryset Airport s, так что коллекция. Таким образом, вы выполняете итерацию по нему. Я бы также посоветовал переименовать переменную в airports , поскольку это намекает на то, что это набор Airport s, так что:

 from django.shortcuts import get_object_or_404

def destination_detail(request, slug):
    destination = get_object_or_404(Destination, slug=slug)
    context = {
        'destination': destination,
        'airports': Airport.objects.filter(city=destination)
    }
    return render(request, 'destination/detail.html', context) 

а затем визуализируйте это с помощью:

 {% for airport in airports %}
    <h1>
        {{ airport.title }}
    </h1>
{% endfor %} 

Примечание: часто лучше использовать get_object_or_404(…) [Django-doc],
а затем использовать .get(…) [Django-doc] напрямую. В случае, если объект не существует,
например, потому, что пользователь сам изменил URL-адрес, get_object_or_404(…) это приведет к возврату ответа HTTP 404 Not Found, тогда как использование
.get(…) приведет к ошибке сервера HTTP 500.

Ответ №2:

Что, если вы добавите в фильтр следующую строку?

 context = {
    'destination': destination,
    'airport': Airport.objects.filter(city_id=destination.id)[0]
}

 

или

 context = {
    'destination': destination,
    'airport': Airport.objects.get(city_id=destination.id)
}

 

Ответ №3:

у вас ничего нет в {{airport.title}} если вы хотите получить название пункта назначения, вы можете сделать

 {{ airport.city.title }}