29

我知道您可以根据其他字段预填充管理表单字段。例如,我有一个基于标题字段自动填充的 slug 字段。

但是,我还想根据日期进行其他自动预填充。例如,我有一个 URL 字段,我希望它自动设置为http://example.com/20090209.mp3,其中 20090209 是 YYYYMMDD。

我还希望有一个文本字段自动以“你好,我的名字是作者”之类的内容开头,其中作者是当前用户的姓名。当然,我也希望该人能够编辑该字段。关键是让用户可以更轻松地填写管理表单,而不仅仅是拥有完全自动的字段。

4

7 回答 7

45

我知道你可以通过 GET 预填充一些值,它会是这样的

http://localhost:8000/admin/app/model/add/?model_field=hello

我在日期字段方面遇到了一些问题,但也许这可以帮助你。

于 2010-06-04T10:47:17.813 回答
27

我最近为此使用了 Django 的ModelAdmin.get_form方法。

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['my_field_name'].initial = 'abcd'
        return form

当您直接操作 base_fields 时,您应该小心副作用。

于 2013-01-14T16:41:46.717 回答
13

Django 的内置 prepopulated_fields 功能被硬编码为 slugify,它不能真正用于更一般的目的。

您需要编写自己的 Javascript 函数来进行预填充。将其包含在管理页面中的最佳方法是将其包含在自定义 Form 或Widget的内部 Media 类中。然后,您需要自定义您的ModelAdmin 子类以使用自定义表单或小部件。最后,您需要与每个预填充字段一起呈现一些内联 Javascript 以注册 onchange 处理程序并告诉它要从哪个其他字段填充;我将通过自定义小部件呈现它。为了使它更好和声明性,您可以使用自定义 ModelAdmin 属性(类似于 prepopulated_fields),并覆盖 ModelAdmin.formfield_for_dbfield 来创建小部件并传入有关它应该从哪个字段预填充的信息。

这种管理员黑客几乎总是可能的,但是(正如您从这个复杂的摘要中可以看出的那样)很少简单,特别是如果您正在努力保持您的代码很好地封装。

于 2009-02-10T11:53:41.170 回答
4

您可以通过将其替换为您选择的表单字段来覆盖默认的 django 管理字段。

检查此项: 向管理员添加自定义验证

于 2009-02-09T23:05:45.577 回答
3

我还希望有一个自动以“你好,我的名字是作者”之类的开头的文本字段。

查看文档:http ://docs.djangoproject.com/en/dev/ref/models/fields/#default

您可以在模型中使用 CharField() 或 TextField(),并设置此选项,这将设置默认文本。'default' 也可以是可调用函数。

类似于:models.CharField(max_length=250, default="Default Text")

于 2009-02-09T22:45:34.190 回答
3

我尝试了其中一些答案,但都没有奏效。我只是想用相关模型中的另一个字段来预置一个字段。以这个答案为起点,我终于尝试直接操作模型实例对象(此处obj),它对我有用。

class MyModelAdmin(models.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
        if not obj.some_model_field:
            obj.some_model_field = obj.related_model.prepopulating_model_field

        return form
于 2017-06-13T21:16:55.637 回答
2

蛞蝓处理是用javascript完成的。

因此,您必须覆盖管理员中的模板,然后使用 javascript 填充字段。日期的事情应该是微不足道的,但我不知道你应该如何将登录的用户名添加到脚本中(不是我想得很辛苦,但你明白了:)。

于 2009-02-09T21:52:27.313 回答