【问题标题】:Title based Slug for URLs in django without app label基于标题的 django 中没有应用标签的 URL 的 Slug
【发布时间】: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


【解决方案1】:

您可以通过更改立即执行此操作:

url(r'^products/', include('products.urls')),

url(r'^', include('products.urls')),

如果您的网站尚未上线,这就是您需要做的所有事情。否则,您还应该同时写入从旧 URL (mysite.com/products/complete-product-title) 到新 URL 的 301 重定向。

【讨论】:

  • 我明白了,但我认为它肯定需要某个应用程序下的新 urls.py 文件的参考。我很愚蠢,因为“产品/”部分与正则表达式无关。现在告诉我如何将标题实现为 url 的 slug。因为我在上面添加的内容对我不起作用,所以它会弹出错误。这很简单,因为我只需要在模型中添加一个 slug 字段并添加一个函数作为 get_absolute_url。最后,我会将 slug 作为 self.slug 返回。但它对我不起作用,请协助。
  • @ShaziaNusrat 您可能应该将它们添加为两个单独的问题 - 一个是如何使您的 slug 字段独一无二,另一个是如何在 haystack 方面解决这个问题。
  • 我正在尝试重定向 'search/' 上的 haystack 搜索查询,并使用 'products/' 作为我的默认网址。如果我失败了,我肯定会发布两个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2012-03-11
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多