我如何在Django中创build一个slu </s>?
我正在尝试在Django中创build一个SlugField。
我创build了这个简单的模型:
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 aaa", s="bbbb") >>> ts 'bbbb' >>> t.save() >>> ts 'bbbb' >>>
我期待bbbb
您将需要使用slugifyfunction。
>>> from django.template.defaultfilters import slugify >>> slugify("bbbb") u'b-bbb' >>>
您可以通过覆盖save
方法自动调用slugify
:
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发生更改,这可能会导致链接断开 。 当您创build一个新的对象时,最好只生成一次slu </s>:
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字符的angular落情况
例:
>>> 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_insert
错误(意外的参数)。
如果您使用pipe理界面添加模型的新项目,则可以在ModelAdmin
中设置ModelAdmin
,并利用admin.py
自动inputslug:
class ClientAdmin(admin.ModelAdmin): prepopulated_fields = {'slug': ('name',)} admin.site.register(Client, ClientAdmin)
在这里,当用户在name
字段的pipe理员表单中input值时,会使用正确的段落name
自动填充段落。
在大多数情况下,slu should不应该改变,所以你真的只想在第一次保存时计算它:
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设置为不可编辑,那么我相信你会想将Null和Blank属性设置为False。 否则,当您尝试保存在pipe理员中时,您会收到错误消息。
所以对上面例子的修改是:
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()
在你的pipe理类中使用prepopulated_fields:
class ArticleAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("title",)} admin.site.register(Article, ArticleAdmin)
我正在使用Django 1.7
在你的模型中创build一个SlugField,像这样:
slug = models.SlugField()
然后在admin.py
定义admin.py
;
class ArticleAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("title",)}