电子商务中类别与产品之间的多对多关系

时间:2019-05-13 14:26:28

标签: python django

我正在使用Django开发电子商务,并且产品和类别模型之间的关系是多对多的。也就是说,一种产品可以属于多个类别。

在产品列表页面中,有一个侧边栏,显示类别列表以及每个类别下的产品列表。我们使用Product的get_absolute_url方法链接到每个产品详细信息页面的网址。

问题在于,在产品详细信息页面(模板)中,我不知道如何获取此产品的类别名称,因为该产品可能属于几个类别。我想使用该产品的类别制作面包屑。

产品型号

class AbstractProduct(models.Model):
...
categories = models.ManyToManyField(
        'catalogue.Category',
        through='ProductCategory',
        verbose_name=_("Categories"))
...
    def get_absolute_url(self):
        return reverse('catalogue:detail', kwargs={'product_slug': self.slug, 'pk': self.id})

产品列表模板(产品型号是产品的型号)

<a href="{{ prod.get_absolute_url }}" class="nav-link text-muted mb-2">{{ prod.model }}</a>

urls.py

from django.urls import path
from . import views

app_name = 'catalogue'

urlpatterns = [
    path('', views.list, name='list'),
    path('<slug:category_slug>/', views.list,  name='list_by_category'),
    path('<slug:product_slug>/<int:pk>', views.detail, name='detail'),
]

1 个答案:

答案 0 :(得分:0)

  

问题在于,在产品详细信息页面(模板)中,我不知道如何获取此产品的类别名称,因为该产品可能属于几个类别。我想使用该产品的类别制作面包屑。

您需要解决此问题,即如何确定应使用哪个类别,然后再继续执行细节。我可以想到两个选择:

  1. 跟踪会话中的类别。
  2. 在产品的网址中添加类别。

2是更好的选择,因为它不依赖某些状态来确定要呈现的内容。如果您在会话中跟踪类别,则用户在会话中期可以清除其Cookie,刷新页面并获得完全不同的视图。通常这是一件坏事。

您将必须确定如何根据您的业务逻辑来最佳设计URL。通常是:category/<category_id>/<product_slug>,因为查看类别应返回多个产品。但是,您的应用程序将决定如何执行此操作。

一个结果是,当您在“类别内”查看产品时,将无法在产品上使用get_absolute_url。用于确定应在url中使用哪种类别的信息在请求中,并且将在视图中可用,但在产品实例上将不可用。