Django 使用具有基于类的视图和分页的多个模型

Django 使用具有基于类的视图和分页的多个模型,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

我有两个型号类别和产品

一个类别有多个产品,一个产品可以有多个类别。 类别本身有一个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_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。请注意对类别模型的更改,这将允许拖拉儿童。