2017-03-23 9 views
1

スラッグが既に存在する場合、slugifyを使用してスラッグを変更したいと考えています。このサイトには同じ名前の複数の製品がありますが、get_object_or_404を使用して製品を呼び出すと、2つ以上のオブジェクトが一度に呼び出されるため、エラーが発生します。これを避けるために、スラグが既に存在する場合、スラグを自動的にインクリメントする必要があります。DjangoでSlugifyを繰り返します。同じ名前の複数のオブジェクトについては、

誰もがこれを手伝ってくれますか?

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

それとも、あなたはそれが存在するかどうかを確認して、ない場合は、増分および追加、スラグを生成することができます:あなたは、両方の製品名およびID、のようなものを組み合わせた場合はどう

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 

答えて

1

カウンターサンプルhereおよびhere

また、あなたはおそらくスラグの一意性を強制する必要があります:あなたがあなた自身をロールバックしたくない場合は

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

素晴らしいそれが働きました。 –

0

あなたはdjango-autoslugを使用することができます。 pip(pip install django-autoslug)でパッケージをインストールし、モデルファイルにインポートしてフィールドとして追加するだけです。 unique=Trueで設定された場合、django-autoslugが衝突に遭遇すると、スラッグの最後に数字が追加され、すでに存在する場合はその数字が増加します。 Githubのページから

例:docsから

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) 

# globally unique, silently fix on conflict ("foo" --> "foo-1".."foo-n") 
slug = AutoSlugField(unique=True) 
関連する問題