【发布时间】:2020-11-05 07:11:04
【问题描述】:
我使用 Slugs 来寻址 URL。一切正常,但是当我想显示产品详细信息时。 我不知道如何从另一个模型中获取两个 slug 并将其放在细节 slug 旁边。
(类别在主 URL 中)
(显示三星手机的所有产品)
作品:site.com/category/mobile/samsung/
(当我想点击其中一个时,我想要显示详细信息,但它不起作用)
不起作用:site.com/category/mobile/samsung/s10
型号:
from Django.db import models
from Django.shortcuts import reverse
class Category(models.Model):
name = models.CharField(max_length=150)
slug = models.SlugField(unique=True, max_length=200)
child_category = models.ForeignKey('self', max_length=150, null=True, blank=True, on_delete=models.CASCADE)
is_child = models.BooleanField(default=False)
def get_absolute_url(self):
return reverse('shop:brands', args=[self.slug])
def get_absolute_url_product(self):
return reverse('shop:products', args=[self.child_category.slug, self.slug])
class Product(models.Model):
category = models.ManyToManyField(to=Category, related_name='products')
name = models.CharField(max_length=150)
slug = models.SlugField(unique=True, max_length=200)
description = models.TextField()
# Here I did what I knew, but It didn't work.
===============================================
def get_absolute_url_details(self):
return reverse('shop:product_details',
self.category.model.slug,
self.category.model.child_category.slug,
self.slug)
当我使用这种相反的方式时,它给了我这个错误: “ForwardManyToOneDescriptor”对象没有属性“slug”
网址:
from Django.urls import path
from Shop import views
app_name = 'shop'
urlpatterns = [
path('<slug:brands_slug>/', views.brands, name='brands'),
path('<slug:brands_slug>/<slug:product_slug>/', views.products, name='products'),
path('<slug:brands_slug>/<slug:product_slug>/<slug:product_details>/', views.details_products, name='product_details'),
]
查看:
def products(request, brands_slug, product_slug):
product = Product.objects.filter(category__slug=product_slug, category__child_category__slug=brands_slug)
context = {'product': product}
return render(request, 'shop/products.html', context=context)
def details_products(request, brands_slug, product_slug, product_details):
details = Product.objects.filter(category__child_category__slug=brands_slug, category__slug=product_slug, slug=product_details)
context = {'details': details}
return render(request, 'shop/product_details.html', context=context)
【问题讨论】:
-
self.category.model.*不是你想象的那样。删除.model部分,例如self.category.slug. -
@Selcuk:当我从它们中删除模型时,它给了我这个错误:“'ManyRelatedManager' 对象没有属性 'slug'”
-
哦,你有一个从产品到类别的多对多关系。在那种情况下
self.category.slug没有意义。 哪个类别?
标签: python python-3.x django django-models reverse