1
我有一个产品和公司模型,其中包含slu for以获得更好的url详细视图。在产品和公司保存到数据库后,我已经使用pre_save信号来保存slu save。我已经写不保存蛞蝓,所以当我发布的产品形式的代码,我得到关于塞在保存产品和公司后立即保存slug
这里的错误是我的代码
class Product(models.Model):
name = models.CharField(max_length=200, unique=True, blank=False, null=False)
company = models.ForeignKey('Company', related_name='products', blank=True, null=True, on_delete=models.SET_NULL)
website = models.URLField(unique=True)
slug = models.SlugField(unique=True)
class Meta:
verbose_name= 'Product'
verbose_name_plural= 'Products'
def __str__(self):
return self.name
def hits(self):
self.hits += 1
self.save(update_fields=['hits'])
class Company(models.Model):
name = models.CharField(max_length=200, unique=True, blank=False, null=False)
slug = models.SlugField(unique=True)
description = models.CharField(max_length=400)
editor = models.ForeignKey(User, related_name='company')
# product = models.ForeignKey(Product, related_name='company')
def get_absolute_url(self):
return reverse("products:view-company", kwargs={"slug": self.slug})
def create_slug(instance, new_slug=None):
slug = slugify(instance.name)
if new_slug is not None:
slug = new_slug
qs = Company.objects.filter(slug=slug).order_by('-id')
if qs.exists():
new_slug = "%s-%S" %(slug, qs.first().id)
return create_slug(instance, slug=new_slug)
return slug
def pre_save_slug_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
from django.db.models.signals import pre_save
pre_save.connect(pre_save_slug_receiver, sender=Company)
def create_slug(instance, new_slug=None):
slug = slugify(instance.name)
if new_slug is not None:
slug = new_slug
qs = Product.objects.filter(slug=slug).order_by('-id')
if qs.exists():
new_slug = "%s-%S" %(slug, qs.first().id)
return create_slug(instance, slug=new_slug)
return slug
def pre_save_slug_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
from django.db.models.signals import pre_save
pre_save.connect(pre_save_slug_receiver, sender=Product)
感谢您的解决方案。这对我来说看起来很复杂,因为我只是初学者。我将不得不花更多的时间来理解这一点。再次感谢 – milan
@米兰哈,在这种情况下,我会稍微更新我的答案。 –
这是一个给我工作。再次感谢。我正在学习文档,您提到的链接以及您的解决方案以更深入地了解。谢谢 – milan