Итак, обо всем по порядку, CBV ...
Они работают, имея встроенное поведение по умолчанию в каждом из них. Для класса ListView возьмем такой пример:
class ArticleListView(ListView):
model = Article
вместе с примером urlpattern:
path('all-articles/', ArticleListView.as_view())
и все. Это все, что необходимо для работы ListView. В этом представлении ArticleListView
будет искать шаблон с именем article_list.html
, и в нем вы можете использовать контекстную переменную object_list
для доступа ко всем объектам Article, которые получает для вас класс, без необходимости явной записи QuerySet.
Конечно, вы можете изменить эти значения, настроить QuerySet и делать все, что угодно, но для этого вам придется изучить документы. Лично я нахожу ccbv намного проще для чтения, чем документы. Так, например, вы можете увидеть на странице ccbv о ListViews, что context_object_name = None
со значением по умолчанию object_list
, как упомянуто выше. Вы можете изменить это, например, context_object_name = 'my_articles'
. Вы также можете установить template_name = 'my_articles.html'
, и это заменит шаблон имени шаблона по умолчанию <<em> модель > _ список. html.
Теперь, о вашем коде,
Если вы уверены, что хотите, чтобы ваша структура URL оставалась такой, какой она есть, вы можете получить представление класса следующим образом, чтобы получить необходимую вам функциональность:
class ItemListView(ListView):
template_name = 'boutique/items.html'
context_object_name = 'categories'
paginate_by = 12
def get_queryset(self):
# This method should return a queryset that represents the items to be listed in the view.
# I think you intend on listing categories in your view, in which case consider changing the view's name to CategoryListView. Just sayin'...
# An instance of this view has a dictionary called `kwargs` that has the url parameters, so you can do the following:
# You need some null assertions here because of the way you've setup your URLs
qs = Categories.objects.filter(men=self.kwargs['gender'], pk=self.kwargs['category_pk'])
return qs
Как видите, мы не сделали В этом представлении классов не нужно устанавливать множество вещей, чтобы он работал. А именно, мы не установили переменную model
, как раньше. Это потому, что нам это не нужно. Часть, которая использует эту переменную, была в методе get_queryset()
по умолчанию, и мы переопределили этот метод. Смотрите CCBV для получения дополнительной информации о реализации по умолчанию get_queryset()
.
Теперь шаблон будет поставляться с объектами из get_queryset()
под именем categories
, потому что это то, что мы установили context_object_name
' Значение s должно быть.
ПРИМЕЧАНИЕ. Переменная model
используется в других местах, кроме get_queryset()
, таких как значение по умолчанию template_name
. Имя шаблона по умолчанию получено из названия модели и template_name_suffix
. Поэтому, если вы не установите переменную model
, убедитесь, что вы установили template_name
вручную.
Я не уверен в логике вашего приложения c, но я думаю, что вы должны изменить Category
модель должна иметь только одно логическое поле, обозначающее пол. Например, мужчины, если это правда, и женщины, если это ложь. Таким образом, категория не может быть как для мужчин, так и для женщин одновременно (если это не то, что вам нужно), и также не может быть ни для одного, потому что в настоящее время вы можете иметь категорию, ложную для обоих половых полей. , что на самом деле не имеет смысла.
Я бы на самом деле предложил совершенно другое решение, включающее ВЫБОР, как таковое:
gender = models.IntegerField(null=False, CHOICES=[(1,'Men'), (2,'Women'), (3,'Other'), (4,'Unisex')], default=3)
Это сохранит в базе данных число, обозначающее пола, и в вашем приложении вы увидите только коррелирующую строку (пол) с этим числом.
Я не пробовал этот код на своей машине, поэтому я мог пропустить несколько вещей, но я надеюсь, я уточнил общую работу CBV.