240

SlugFieldDjangoで作成しようとしています。

この単純なモデルを作成しました:

from django.db import models

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

次に、これを行います。

>>> from mysite.books.models import Test
>>> t=Test(q="aa a a a", s="b b b b")
>>> t.s
'b b b b'
>>> t.save()
>>> t.s
'b b b b'

期待していb-b-b-bました。

4

9 に答える 9

446

slugify関数を使用する必要があります。

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

メソッドslugifyをオーバーライドすることで、自動的に呼び出すことができます。save

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()
    
    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(Test, self).save(*args, **kwargs)

q上記により、フィールドを編集すると URL が変更され、リンクが壊れる可能性があることに注意してください。新しいオブジェクトを作成するときは、スラッグを 1 回だけ生成する方が望ましい場合があります。

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()
    
    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)
于 2009-05-08T01:22:34.240 に答える
113

いくつかのutf-8文字のコーナーケースがあります

例:

>>> from django.template.defaultfilters import slugify
>>> slugify(u"test ąęśćółń")
u'test-aescon' # there is no "l"

これはUnidecodeで解決できます

>>> from unidecode import unidecode
>>> from django.template.defaultfilters import slugify
>>> slugify(unidecode(u"test ąęśćółń"))
u'test-aescoln'
于 2012-08-31T09:05:21.163 に答える
68

Thepeer の回答に対する小さな修正:save()モデル クラスで関数をオーバーライドするには、引数を追加することをお勧めします。

from django.utils.text import slugify

def save(self, *args, **kwargs):
    if not self.id:
        self.s = slugify(self.q)

    super(test, self).save(*args, **kwargs)

そうしないtest.objects.create(q="blah blah blah")と、force_insertエラーになります (予期しない引数)。

于 2009-09-26T04:36:35.140 に答える
31

管理インターフェイスを使用してモデルの新しいアイテムを追加している場合は、 を設定して、スラッグの入力を自動化するために利用できModelAdminます。admin.pyprepopulated_fields

class ClientAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}

admin.site.register(Client, ClientAdmin)

nameここで、ユーザーがフィールドの管理フォームに値をslug入力すると、正しい slugified が自動的に入力されますname

于 2009-05-09T07:26:29.480 に答える
22

ほとんどの場合、スラッグは変更されるべきではないので、実際には最初の保存時にのみ計算する必要があります。

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(editable=False) # hide from admin

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(Test, self).save()
于 2009-05-09T10:10:12.487 に答える
6

slugfield を Not be editable に設定したくない場合は、Null および Blank プロパティを False に設定することをお勧めします。そうしないと、管理者に保存しようとするとエラーが発生します。

したがって、上記の例を変更すると、次のようになります::

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(null=True, blank=True) # Allow blank submission in admin.

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(test, self).save()
于 2010-12-14T15:26:49.690 に答える
6

管理クラスで使用prepopulated_fieldsします。

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Article, ArticleAdmin)
于 2011-02-04T08:14:47.780 に答える
4

私はDjango 1.7を使用しています

次のようにモデルに SlugField を作成します。

slug = models.SlugField()

次にadmin.py定義しますprepopulated_fields

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}
于 2015-02-15T13:58:37.550 に答える