Me gustaría poder cambiar la babosa usando slugify si la babosa ya existe. Este sitio tendrá varios productos con el mismo nombre, pero cuando llame al producto usando get_object_or_404 obtendrá un error porque se están llamando a dos o más objetos a la vez. Para evitar esto, necesito incrementar automáticamente el slugify si el slug ya existe.

Puede alguien ayudarme con esto?

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
Tom Myers 23 mar. 2017 a las 23:21

2 respuestas

La mejor respuesta

¿Qué sucede si combina tanto el nombre del producto como la identificación , algo así como:

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

O bien, puede generar una babosa, verificar si existe y, si es así, incrementar y agregar el contador - muestre aquí y aquí.

Además, probablemente deberías aplicar la singularidad de la babosa:

slug = models.SlugField(max_length=500, unique=True) 
1
Community 23 may. 2017 a las 12:17

Puede usar django-autoslug si no quiere rodar el suyo. Simplemente instale el paquete con pip (pip install django-autoslug), importe en su archivo de modelo y agréguelo como campo. Cuando se configura con unique=True, si django-autoslug se encuentra con una colisión, agregará un número al final de la bala e incrementará ese número si ya existe.

Ejemplo de la página de 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)

Del docs:

# globally unique, silently fix on conflict ("foo" --> "foo-1".."foo-n")
slug = AutoSlugField(unique=True)
0
Darrick Herwehe 23 mar. 2017 a las 20:55