ash*_*her 35 python django slug
class Foo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
Run Code Online (Sandbox Code Playgroud)
是否有一种内置的方法可以根据标题让slug字段自动填充?也许在管理员和管理员之外.
cam*_*lan 63
对于Django 1.0及更高版本的Admin,您需要使用
prepopulated_fields = {'slug': ('title',), }
Run Code Online (Sandbox Code Playgroud)
在你的admin.py中
prepopulated_fields字典中的键是要填充的字段,值是要连接的字段的元组.
在管理员之外,您可以slugify
在视图中使用该功能.在模板中,您可以使用|slugify
过滤器.
还有这个包将自动处理这个:https://pypi.python.org/pypi/django-autoslug
我想我会添加一个完整且最新的答案,其中提到了问题:
如果您只关心在管理中添加和更新数据,您可以简单地使用prepopulated_fields属性
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
Run Code Online (Sandbox Code Playgroud)
如果您已经使用表单构建了自己的服务器渲染界面,则可以在保存表单 (is_valid) 时使用|slugify模板过滤器或slugify实用程序自动填充字段。
当通过这些接口(管理或自定义表单)操作数据时,上述解决方案只会自动填充 slugfield(或任何字段)。如果您有 API、管理命令或其他任何也可以操作数据的东西,您需要下降到模型级别。
django-autoslug提供了 AutoSlugField-fields ,它扩展了 SlugField 并允许您设置它应该整齐地 slugify 的字段:
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
Run Code Online (Sandbox Code Playgroud)
该字段使用 pre_save 和 post_save 信号来实现其功能,因此请参阅此答案底部的陷阱文本。
最后一个选项是自己实现,这涉及覆盖默认的 save() 方法:
class Article(Model):
title = CharField(max_length=200)
slug = SlugField()
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这是 Django 初学者常见的误解。首先您应该知道 pre_save 和 post_save 信号与 save() 方法直接相关。其次,Django 中进行批量更新的不同方法都通过直接在 SQL 层上操作来绕过 save() 方法来实现高性能。这意味着对于上面解决方案 3 或 4 中使用的示例模型:
要进行批量更新并仍然利用代码级约束,唯一的解决方案是逐个迭代对象并调用其 save() 方法,该方法的性能比 SQL 级批量操作低得多。您当然可以在数据库中使用触发器,尽管这是一个完全不同的主题。