Django: Перебор всех атрибутов поля OneToOneField внутри шаблона
Я пытаюсь перебрать все связанные атрибуты поля OneToOneField внутри шаблона Django, но он выдает ошибку 'PropertyFeatures' object is not iterable. Этот список характеристик будет значительно расти, и выводить их по отдельности с собственным утверждением {% if %} - не лучшая идея. Возможно ли перебирать OneToOneField атрибуты внутри шаблона?
Модели
class PropertyFeatures(models.Model):
property = models.OneToOneField(Property, related_name="features", on_delete=models.CASCADE)
is_pet_friendly = models.BooleanField(default=False)
has_garden = models.BooleanField(default=False)
Виды
def property_detailview(request, pk):
template_name = "property/detail.html"
property = Property.objects.get(id=pk)
context = {
"property": property,
}
return render(request, template_name, context)
Шаблон
{% block content %}
{% include "includes/navigation/navbar.html" %}
<div class="container">
<h1>
{{ property.title }}
</h1>
<div>
{{ property.features.has_garden }} <-- This works
{% for feature in property.features %} <-- This gives an error
{{ feature }}
{% endfor %}
</div>
</div>
{% endblock content %}
OneToOne, как следует из названия, представляет собой один объект. Он не является итерируемым. Не существует встроенного метода для итерации по атрибутам модели. Вы можете написать один:
class PropertyFeatures(models.Model):
...
@property # a Python language feature
def feature_list(self):
return [ self.is_pet_friendly, self.has_garden ] # add to as necessary
{% for feature in property.features.feature_list %}
(мимоходом, является ли это правильным дизайном? Вместо этого можно было бы иметь модель Feature с отношениями ForeignKey или ManyToMany с Property, которые были бы взаимозаменяемы с property.features.all ).