Django 使用具有基于类的视图和分页的多个模型
我有两个型号类别和产品 一个类别有多个产品,一个产品可以有多个类别。 类别本身有一个FKDjango 使用具有基于类的视图和分页的多个模型,django,django-models,django-views,django-class-based-views,Django,Django Models,Django Views,Django Class Based Views,我有两个型号类别和产品 一个类别有多个产品,一个产品可以有多个类别。 类别本身有一个FK `class Product(models.Model): categories = models.ManyToManyField(Category, related_name='products') class Category(models.Model): parent = models.ForeignKey('self', blank=True, null=True, verbose
`class Product(models.Model):
categories = models.ManyToManyField(Category, related_name='products')
class Category(models.Model):
parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category', on_delete=models.CASCADE)`
对于模板,我需要:
类别数据及其子/子类别数据
类别和子类别中的产品
产品分页
我使用的是基于类的视图,我不知道使用哪个作为类的模型属性,因为:
如果我使用类别a,我不知道如何按产品而不是按类别设置分页
如果我使用产品,我需要从url中获取类别slug/id,并按类别过滤产品查询集,还需要将它们传递给上下文
如果使用RawQuerySet,则会出现一个错误RawQuerySet“没有len”
您应该将您的模型设置为Product,因为这是您基本上正在查看和分页的模型。您的视图类应该类似于以下答案: 型号:
class Product(models.Model):
categories = models.ManyToManyField(Category, related_name='products')
class Category(models.Model):
parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category', related_name='children', on_delete=models.CASCADE)
您还需要更改get_queryset以过滤掉类别PK。我认为它应该是这样的:
def get_children_recursive(parent_category):
children = parent_category.children.all() # This depends on adding related_name to Category
for child in children:
children += get_children_recursive(child)
return children
class ProductListView(ListView):
paginate_by = 10
template_name = 'templates/your_product_view.html'
model = Product
context_object_name = 'products'
def get_queryset(self):
category = Category.objects.get(id=self.kwargs['category_id'])
all_children = get_children_recursive(category)
return Product.objects.filter(categories=all_children)
category_id应来自URL,并且在URL文件中应类似于以下内容:
urlpatterns = patterns('',
(r'^products/(?P<category_id>\d+)/$', ProductListView.as_view()),
)
问题是,kwargs的category_id是不够的,因为我还需要子类别id,而且在url中我有slug/所以我需要id,并且只有一个slug;另一件事是,我还需要上下文中的category/subcategories数据,并在queryset中调用它们,然后在上下文中创建重复项,并添加一个应该解决您的问题的编辑。完全未经测试,因此您可能需要在这里和那里解决一个小的输入错误/bug。请注意对类别模型的更改,这将允许拖拉儿童。