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"
이것은 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)
Otherwise, test.objects.create(q="blah blah blah")
will result in a force_insert
error (unexpected argument).
If you're using the admin interface to add new items of your model, you can set up a ModelAdmin
in your admin.py
and utilize prepopulated_fields
to automate entering of a slug:
class ClientAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('name',)}
admin.site.register(Client, ClientAdmin)
Here, when the user enters a value in the admin form for the name
field, the slug
will be automatically populated with the correct slugified name
.
In most cases the slug should not change, so you really only want to calculate it on first save:
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()
Use prepopulated_fields
in your admin class:
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
If you don't want to set the slugfield to Not be editable, then I believe you'll want to set the Null and Blank properties to False. Otherwise you'll get an error when trying to save in Admin.
So a modification to the above example would be::
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()
I'm using Django 1.7
Create a SlugField in your model like this:
slug = models.SlugField()
Then in admin.py
define prepopulated_fields
;
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
You can look at the docs for the SlugField
to get to know more about it in more descriptive way.
참고URL : https://stackoverflow.com/questions/837828/how-do-i-create-a-slug-in-django
'IT story' 카테고리의 다른 글
피해야 할 jQuery 함정 (0) | 2020.04.30 |
---|---|
다른 문자열의 x 위치에 문자열 삽입 (0) | 2020.04.30 |
URL의 마지막 세그먼트 (0) | 2020.04.30 |
.NET에서 두 배열 병합 (0) | 2020.04.30 |
파일 또는 어셈블리를로드 할 수 없습니다… 매개 변수가 잘못되었습니다 (0) | 2020.04.30 |