urlの詳細な表示のためにslugが含まれている製品と会社のモデルがあります。私は、製品と会社がデータベースに保存されるとすぐに、スラッグを保存するためにpre_save信号を使用しました。私が書いたコードは、私は、製品のフォームを投稿するとき、私はここでエラーに関するスラグ商品と会社のスラッグを保存するとすぐに保存します
を取得するので、スラグを保存していない私のコードは、私がナメクジのフィールドのような一般的な属性のベースミックスインのセットを持って
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