Пожалуйста, измените следующую строку в классе Property
:
category = models.ForeignKey(to='Category', null=True, related_name='categories', on_delete=models.SET_NULL,)
к этому:
category = models.ForeignKey(
to='Category',
null=True,
related_name=<b>'properties'</b>,
on_delete=models.SET_NULL,
)
Изменение выделено жирным шрифтом. Причина изменения заключается в том, что вы хотите получить свойств для данной категории . Выполнение запроса типа Category.categories
сбивает с толку читателя.
Доступ к related_name
, который теперь properties
, возможен с объекта Category
. То, как вы делаете это в классе CategoryDetail
:
queryset = Category.categories
, даже если адаптировано к:
queryset = <b>Category.properties</b>
не может работать. Это потому, что он вызвал бы связанный дескриптор ReverseManyToOneDescriptor
, который здесь бесполезен.
Вы можете вызывать свойства для объекта Category
. Примером может быть:
Category.objects.get(pk=1).properties.all()
Первая часть Category.objects.get(pk=1)
вернет один объект Category
, а во второй части properties.all()
вы вызовете менеджера properties
для объекта Category
. С помощью метода all()
вы получаете QuerySet, содержащий все properties
для данного Category
объекта.
Помните, что использование что-то вроде Category.objects.all().properties.all()
не будет работать. Category.objects.all()
вернет QuerySet без атрибута properties
.
С учетом этого наилучшим подходом было бы то, что @Alasdair предлагает использовать DetailView
. Вы хотите список все Свойства для Категория , и это вас немного смущает. Однако вы по-прежнему отображаете подробности s для категории. Использование DetailView
для Category
- намного более чистый и приятный подход.
Имея просто:
class CategoryDetail(DetailView):
model = Category
сделает работу. Имя шаблона по умолчанию будет category_detail.html
, и вам не нужно указывать его явно. Просто будьте последовательны с другими классами.
Внутренняя логика подробного представления извлечет отдельный объект Category
, и в шаблоне вы можете получить доступ к properties
для этого объекта:
{% for property in object.properties.all %}
{{ property }}
{% endfor %}
Вместо object.properties.all
вы можете использовать category.properties.all
, что является более многословным и улучшает читабельность.
Если вы хотите изменить это, сделайте это, например:
class CategoryDetail(DetailView):
model = Category
context_object_name = 'ctgr'
{% for property in ctgr.properties.all %}
Надеюсь, это поможет вам двигаться вперед.