sourcecode

장고에 민달팽이 어떻게 만들어요?

copyscript 2022. 9. 14. 22:24
반응형

장고에 민달팽이 어떻게 만들어요?

작성하려고 합니다.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.

슬러피라이즈 기능을 사용해야 합니다.

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

위의 내용에 따라 URL이 변경될 수 있습니다.q필드가 편집되어 링크가 끊어질있습니다.새 개체를 만들 때 슬래그를 한 번만 생성하는 것이 좋습니다.

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"

이 문제는 Unidecode로 해결할 수 있습니다.

>>> 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")결과적으로force_inserterror(예상하지 않은 인수).

관리 인터페이스를 사용하여 모델의 새 항목을 추가하는 경우ModelAdmin당신의 안에서admin.py를 사용하여 슬래그 입력을 자동화합니다.

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

admin.site.register(Client, ClientAdmin)

여기서 사용자가 admin 폼에 값을 입력하면name필드,slug자동으로 올바른 슬러티라이즈로 채워집니다.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()

slugfield를 Not be editable로 설정하지 않으려면 Null 및 Blank 속성을 False로 설정해야 합니다.그렇지 않으면 Admin에 저장하려고 할 때 오류가 발생합니다.

따라서 위의 예에 대한 변경은 다음과 같습니다.

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

관리자 클래스에서 사용:

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

admin.site.register(Article, ArticleAdmin)

저는 장고 1.7을 쓰고 있어요.

모델에 다음과 같이 SlugField를 만듭니다.

slug = models.SlugField()

그럼 인admin.py정의하다prepopulated_fields;

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

자세한 것은, 의 메뉴얼을 참조해 주세요.

언급URL : https://stackoverflow.com/questions/837828/how-do-i-create-a-slug-in-django

반응형