我如何在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) 

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields

我正在使用Django 1.7

在你的模型中创build一个SlugField,像这样:

 slug = models.SlugField() 

然后在admin.py定义admin.py ;

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