问题:如何在Django中创建子弹?
我正在尝试SlugField
在Django中创建一个。
我创建了这个简单的模型:
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
。
回答 0
您将需要使用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)
回答 1
有一些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'
回答 2
对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
错误(意外参数)。
回答 3
如果您使用的管理界面增加模型的新项目,你可以建立一个ModelAdmin
在你admin.py
和利用prepopulated_fields
自动进入蛞蝓的:
class ClientAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('name',)}
admin.site.register(Client, ClientAdmin)
在这里,当用户在admin表单中为该name
字段输入值时,slug
将使用正确的slugified自动填充name
。
回答 4
在大多数情况下,该条块不应更改,因此您实际上只想在首次保存时进行计算:
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()
回答 5
使用prepopulated_fields
在您的管理类:
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
回答 6
如果您不想将slugfield设置为“不可编辑”,那么我相信您希望将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()
回答 7
我正在使用Django 1.7
像这样在模型中创建一个SlugField:
slug = models.SlugField()
然后在admin.py
定义prepopulated_fields
;
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
回答 8
您可以查看的文档,SlugField
以更具描述性的方式进一步了解它。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。