是有一个简单的方法来填充SlugField从CharField?
题
class Foo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
是否有一个内置的方式得到的弹头场自动填充的基础上的标题?也许是在管理部和外部的管理。
解决方案
对于Django 1.0及更高版本的Admin,您需要使用
prepopulated_fields = {'slug': ('title',), }
你的admin.py 中的
您在prepopulated_fields字典中的键是您要填充的字段,该值是您想要连接的字段的元组。
在管理员之外,您可以在视图中使用 slugify
功能。在模板中,您可以使用 | slugify
过滤器。
此软件包还会自动处理此问题: https://pypi.python .ORG /的PyPI / Django的autoslug
其他提示
在管理员之外,请参阅此django代码段。将它放在 .save()
中,它将与以编程方式创建的对象一起使用。在管理员内部,正如其他人所说,使用 prepopulated_fields
。
您还可以使用pre_save django信号填充django管理代码之外的slug。 请参阅 Django信号文档。
Ajax slug唯一性验证也很有用,请参阅 As-You-Type Slug Uniqueness Validation @ Irrational Exuberance
autoslug 过去对我来说效果很好。虽然我从未尝试过使用管理员应用程序。
以为我会添加一个完整和最新的答复与问题提到:
1.自动填充的形式在Django管理
如果你是只关注增加和更新数据管理员,你可以简单地使用 prepopulated_fields 属性
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
2.自动填充定义形式中的模板
如果你已经建立你自己的服务器提供的接口与形式,可以自动填充的领域通过使用 |slugify tamplate过滤器或 slugify 用当保存的形式(is_valid).
3.自动填充slugfields在模型的平与django autoslug
上述解决方案,只会自动填充slugfield(或任何领域),当数据被操纵通过这些接口(管理或定制的形式)。如果你有一个API、管理命令或任何其他还操纵你需要的数据下降到模型水平。
django autoslug 提供AutoSlugField领域的延伸SlugField和允许设定哪些领域应该slugify整齐:
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
该领域的使用pre_save和post_save信号,以实现其功能,所以请参阅本地文字在底部的这个答案。
4.自动填充slugfields在模型级别的首要save()
最后的选择是实现这个自己,其中涉及压倒一切的默认保存()方法:
class Article(Model):
title = CharField(max_length=200)
slug = SlugField()
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Job, self).save(*args, **kwargs)
注:大容量的更新将绕过你的代码(包括信号)
这是一种常见的错误理解通过初学者Django。首先你应该知道,pre_save和post_save的信号直接相关的save()-方法。其次不同的方式做大量更新在Django所有规避保存()-方法实现高效,通过操作直接在SQL-层。这意味着,例模型中使用的解决方案3个或4个以上:
- 文章。对象。所有().更新(title='新员额')将 不 更新弹头的任何文章
- 使用 bulk_create 或 bulk_update 上文模型 不 更新弹头的任何文章。
- 由于save()-方法不叫, 没有pre_save或post_save信号都会被发现.
做散的更新和仍在利用代码水平的限制,唯一的解决办法是迭代的对象之一,并呼吁其save()方法,它已大幅度下性能比SQL级散装行动。当然,你可以使用的触发器在你的数据库,虽然这是一个完全不同的主题。