[python] Django에서 슬러그를 어떻게 만듭니 까?

SlugField장고에서 를 만들려고합니다 .

이 간단한 모델을 만들었습니다.

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.



답변

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이 변경되어 링크가 끊어 질 수 있습니다 . 새 객체를 만들 때 슬러그를 한 번만 생성하는 것이 좋습니다.

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)


답변

utf-8 문자가있는 코너 케이스가 있습니다

예:

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

이것은 유니 코드 로 해결할 수 있습니다

>>> from unidecode import unidecode
>>> from django.template.defaultfilters import slugify
>>> slugify(unidecode(u"test ąęśćółń"))
u'test-aescoln'


답변

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")A의 발생합니다 force_insert오류 (예기치 않은 인수).


답변

당신이 모델의 새 항목을 추가하는 관리 인터페이스를 사용하는 경우, 당신은을 설정할 수 있습니다 ModelAdmin당신에 admin.py와 활용 prepopulated_fields슬러그의 입력 자동화 :

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

admin.site.register(Client, ClientAdmin)

여기서 사용자가 name필드 의 관리 양식에 값을 slug입력하면 올바른 slugified로 자동으로 채워집니다 name.


답변

대부분의 경우 슬러그는 변경되지 않아야하므로 처음 저장할 때만 계산하려고합니다.

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()


답변

prepopulated_fields관리자 클래스에서 사용하십시오 .

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

admin.site.register(Article, ArticleAdmin)


답변

슬러그 필드를 편집 불가능으로 설정하지 않으려면 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()