11

Django で抽象的な親モデルを作成しようとしています。これは、他の多くの子モデルの名前フィールドからスラッグフィールドを作成するのに役立ちます。キリル文字からラテン文字への変換に最適なトランスエンコーディングを使用します。次に、django の slugify 関数を使用してゴミを取り除きます。

class SlugModel(models.Model):
    class Meta:
        abstract = True

    name = models.CharField(max_length=128, default=u'')
    slug = models.CharField(max_length=128,blank=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            slug = slugify(unicode(self.name).encode('trans'))
        else:
            slug = self.slug
        count = self.__class__.objects.filter(slug = slug).count()
        if count > 1:
            if slug[-2]=='_':
                count = int(slug[-1])
                slug = slug[:-2]
            self.slug = '{0}_{1}'.format(slug,count+1)
        else:
            self.slug = slug
        super(self.__class__, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name



class Foo(SlugModel):
    pass

この問題は、いくつかの Foo オブジェクトを保存しようとしたときに発生します。これにより、RuntimeError (最大再帰深度を超えました) が発生します。私は何を間違っていますか?どうすればsuper(self.__class__, self).save(*args, **kwargs)正しく書けるでしょうか?

4

2 に答える 2

12

はい、分かりました。を使用する代わりに super(self.__class__, self).save(*args, **kwargs)

が必要でし super(SlugModel, self).save(*args, **kwargs)た。

ペッパーグロワーに感謝します。

于 2012-11-18T22:16:32.337 に答える