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

对于1.0之前的版本:

slug = models.SlugField(prepopulate_from=('title',))

应该可以正常工作

对于1.0,请使用 camflan's

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_createbulk_update 上文模型 更新弹头的任何文章。
  • 由于save()-方法不叫, 没有pre_save或post_save信号都会被发现.

做散的更新和仍在利用代码水平的限制,唯一的解决办法是迭代的对象之一,并呼吁其save()方法,它已大幅度下性能比SQL级散装行动。当然,你可以使用的触发器在你的数据库,虽然这是一个完全不同的主题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top