#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 }}