class Foo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
是否有一种内置的方法可以根据标题让slug字段自动填充?也许在管理员和管理员之外。
对于Django 1.0及更高版本的Admin,您需要使用
prepopulated_fields = {'slug': ('title',), }
在你的admin.py中
prepopulated_fields字典中的键是要填充的字段,值是要连接的字段的元组。
在管理员之外,您可以在视图中使用slugify
函数。在模板中,您可以使用|slugify
过滤器。
还有这个包将自动处理:https://pypi.python.org/pypi/django-autoslug
在管理员之外,请参阅this django snippet。把它放在你的.save()
中,它将与以编程方式创建的对象一起使用。在管理员内部,正如其他人所说,使用prepopulated_fields
。
您还可以使用pre_save django信号填充django管理代码之外的slug。见Django signals documentation。
Ajax slug唯一性验证也很有用,请参阅As-You-Type Slug Uniqueness Validation @ Irrational Exuberance
autoslug过去对我来说效果很好。虽然我从来没有尝试过使用管理员应用程序。
以为我会添加一个完整的,最新的回答与提到的陷阱:
如果您只关心在管理员中添加和更新数据,则只需使用prepopulated_fields属性即可
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
如果您使用表单构建了自己的服务器呈现界面,则可以在保存表单(is_valid)时使用|slugify tamplate过滤器或slugify实用程序自动填充字段。
上述解决方案只会在通过这些接口(管理员或自定义表单)操作数据时自动填充子区域(或任何字段)。如果您有API,管理命令或其他任何操作数据的内容,则需要将其下拉到模型级别。
django-autoslug提供了AutoSlugField-fields,它扩展了SlugField并允许你设置它应该整齐地敲击的字段:
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
该字段使用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(Job, self).save(*args, **kwargs)
这是初学者对Django的一种常见的错误理解。首先,您应该知道pre_save和post_save信号与save() - 方法直接相关。其次,在Django中进行批量更新的不同方法都是通过直接在SQL层上操作来绕过save()方法来实现高性能。这意味着对于上面的解决方案3或4中使用的示例模型:
要进行批量更新并仍然使用代码级约束,唯一的解决方案是逐个迭代对象并调用其save()方法,该方法的性能远低于SQL级批量操作。您当然可以在数据库中使用触发器,尽管这是一个完全不同的主题。