【问题标题】:Iterate Slugify In Django. For multiple objects named the same在 Django 中迭代 Slugify。对于多个同名对象
【发布时间】:2017-08-16 14:37:27
【问题描述】:

如果 slug 已经存在,我希望能够使用 slugify 更改 slug。该站点将有多个名称相同的产品,但是当您使用 get_object_or_404 调用该产品时,您将收到错误消息,因为一次调用了两个或多个对象。为了避免这种情况,如果 slug 已经存在,我需要自动增加 slugify。

谁能帮我解决这个问题?

class Product(models.Model):
    product_name = models.CharField(max_length=500, blank=True)
    product_description = models.TextField(blank=True)
    company = models.ForeignKey(Company, blank=True, null=True)
    category = models.ForeignKey(Category, blank=True, null=True)
    manufacturer = models.ForeignKey(Manufacturer)
    buy_link = models.URLField(max_length=1000, blank=True)
    product_image_url = models.URLField(max_length=1000, blank=True)
    price = models.CharField(max_length=30, blank=True)
    orginal_price = models.CharField(max_length=30, blank=True)
    stock = models.CharField(max_length=30, blank=True)
    sku = models.CharField(max_length=250, blank=True)
    slug = models.SlugField(max_length=500)
    date_added = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.product_name)
        super(Product, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('products:product_detail', args=[self.slug]) #kwargs={'slug': self.slug}

    def __str__(self):
        return self.product_name  

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您同时结合 产品名称和 ID 会怎样,例如:

    def save(self, *args, **kwargs):
        self.slug = slugify("{obj.product_name}-{obj.id}".format(obj=self))
        super(Product, self).save(*args, **kwargs)
    

    或者,您可以生成一个 slug,检查它是否存在,如果存在,增加并附加计数器 - 示例 herehere

    此外,您可能应该强制执行 slug 唯一性:

    slug = models.SlugField(max_length=500, unique=True) 
    

    【讨论】:

      【解决方案2】:

      如果您不想自己动手,可以使用django-autoslug。只需使用 pip (pip install django-autoslug) 安装包,导入模型文件,然后将其添加为字段。当使用unique=True 设置时,如果django-autoslug 遇到冲突,它将在 slug 的末尾附加一个数字,如果该数字已经存在,则增加该数字。

      Github 页面示例:

      from django.db.models import CharField, Model
      from autoslug import AutoSlugField
      
      class Article(Model):
          title = CharField(max_length=200)
          slug = AutoSlugField(populate_from='title', unique=True)
      

      来自docs

      # globally unique, silently fix on conflict ("foo" --> "foo-1".."foo-n")
      slug = AutoSlugField(unique=True)
      

      【讨论】:

      • 这很好,只是从 Django 1.9 开始,'django.core.urlresolvers' 已被弃用。
      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多