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