【发布时间】:2016-06-19 07:43:31
【问题描述】:
我得到了带有 ListView 和 DetailView 的产品应用程序。我需要在详细页面上实现带有产品标题的 slug,而 url 中没有应用标签。例如在详细页面中,它应该显示“mysite.com/complete-product-title”而不是“mysite.com/products/complete-product-title”。这个详细信息页面可以帮助我为 SEO 做很多事情。
以下是代码:
models.py:
class Product(models.Model):
title = models.CharField(max_length=500)
description = models.TextField(blank=True, null=True)
price = models.DecimalField(max_digits=20, decimal_places=2)
sku = models.CharField(null=True, max_length=100)
url = models.URLField(blank=True)
slug = models.SlugField(default='')
categories = models.ManyToManyField('Category', blank=True)
default = models.ForeignKey('Category', related_name='default_category', null=True, blank=True)
def __unicode__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def get_absolute_url(self):
kwargs={"slug": self.slug}
return reverse('product_detail', kwargs=kwargs)
Views.py:
class ProductListView(ListView):
model = Product
paginate_by = 20
def get_context_data(self, *args, **kwargs):
context = super(ProductListView, self).get_context_data(*args, **kwargs)
return context
def get_queryset(self, *args, **kwargs):
query = super(ProductListView, self).get_queryset(*args, **kwargs)
return query
class ProductDetailView(DetailView):
model = Product
slug_field = 'slug'
项目 urls.py:
url(r'^products/', include('products.urls')),
应用 urls.py:
url(r'^(?P<slug>[\w-]+)/$', ProductDetailView.as_view(), name='product_detail'),
我已经使用 haystack 实现了 elasticsearch,为此我必须在项目根 urls.py 中添加 haystack url,例如 url(r'^$', include('haystack.urls'), name='search'),
我的产品应用程序的完整 models.py 是
class Product(models.Model):
title = models.CharField(max_length=500)
description = models.TextField(blank=True, null=True)
price = models.DecimalField(max_digits=20, decimal_places=2)
sku = models.CharField(null=True, max_length=100)
url = models.URLField(blank=True)
slug = models.SlugField(unique=False)
categories = models.ManyToManyField('Category', blank=True)
default = models.ForeignKey('Category', related_name='default_category', null=True, blank=True)
def __unicode__(self):
return self.title
def get_absolute_url(self):
return reverse('product_detail', kwargs={"slug":self.slug})
def get_image_url(self):
img = self.productimage_set.first()
if img:
return img.image.url
return img
class Category(models.Model):
title = models.CharField(max_length=120, unique=True)
#slug = models.SlugField(unique=True)
description = models.TextField(null=True, blank=True)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
def __unicode__(self):
return self.title
def image_upload_to(instance, filename):
title = instance.product.title
slug = slugify(title)
basename, file_extension = filename.split('.')
new_filename = '%s-%s.%s'%(basename, instance.id, file_extension)
return 'products/%s/%s' %(slug, new_filename)
class ProductImage(models.Model):
product = models.ForeignKey(Product)
image = models.ImageField(upload_to=image_upload_to)
def __unicode__(self):
return self.product.title
当我尝试添加 slug=models.SlugField(unique=True) 时,我收到类似 column slug is not unique 的错误消息。
现在我无法从url(r'^products/', include('products.urls')), 中删除products/,因为那样它将使干草堆网址和产品应用程序网址都成为默认值。这里的最终目标是默认实现 haystack url,但不显示 'mysite.com/products/product-title-as-slug' 而不是 'mysite.com/product-title-as-slug'。
请协助我如何实现这一目标。
【问题讨论】:
-
你的意思是你只希望你的产品网址在网站的根目录,比如
url(r'^', include('products.urls')),? -
我知道,我可以直接将它添加到基于项目的 urls.py 中,而不是在基于应用程序的 urls.py 中添加 url,因此它将是“mysite.com/complete-product-title”而不是'mysite.com/products/complete-product-title'。但是如何在基于通用的详细视图中实现它。简单地如何在 product_detail 页面的 url 中添加标题作为 slug。
标签: regex django django-urls