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

时间:2018-06-15 11:58:46

标签: django django-models django-views django-class-based-views

我有2个型号的分类和产品。

类别包含多个产品,而产品可以包含多个类别。 一个类别对自己有一个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)`

对于我需要的模板:

  • 类别数据及其子/子类别数据
  • 类别和子类别中的产品
  • 产品分页

我使用的是基于类的视图,我不知道该类的model属性使用哪个,因为:

  • 如果我使用类别a,我不知道如何按产品而非按类别设置分页
  • 如果我使用Product,我需要从url获取类别slug / id并按类别过滤Product queryset并将它们传递给上下文
  • 如果我使用RawQuerySet,则会收到错误RawQuerySet' has no len()

1 个答案:

答案 0 :(得分:1)

您应该将模型设置为Product,因为那是您实际上正在查看和分页的模型。您的视图类应该类似于以下答案:https://stackoverflow.com/a/41297420/769971

型号:

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应该来自网址,在您的网址文件中应该如下所示:

urlpatterns = patterns('',
    (r'^products/(?P<category_id>\d+)/$', ProductListView.as_view()),
)