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 ).

Вернуться на верх