Django - 如何预填充管理表单字段

时间:2009-02-09 20:52:34

标签: python django django-admin django-forms

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

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

我还希望有一个文本字段,自动以“Hello my name is author”之类的东西开头,其中author是当前用户的名字。当然,我也希望这个人能够编辑该字段。关键是要做到这一点,以便用户可以更轻松地填写管理表单,而不仅仅是拥有完全自动化的字段。

7 个答案:

答案 0 :(得分:30)

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

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

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

答案 1 :(得分:14)

我最近为此目的使用了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时,Yout应该注意副作用。

答案 2 :(得分:13)

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

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

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

答案 3 :(得分:3)

  

我还想要一个文本字段   自动开始   像“你好,我的名字是   作者”。

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

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

像:   models.CharField(max_length = 250,默认=“默认文本”)

答案 4 :(得分:3)

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

检查一下: Add custom validation to the admin

答案 5 :(得分:2)

slug处理是用javascript完成的。​​

因此您必须override管理员中的模板,然后使用javascript填充字段。日期应该是微不足道的,但我不知道你应该如何将登录的用户名称添加到脚本中(不是我认为很难,但你得到漂移:)。

答案 6 :(得分:0)

我尝试了一些这些答案,但没有一个能奏效。我只是想用相关模型中的另一个字段预填充一个字段。以this答案为出发点,我终于尝试直接操作模型实例对象(此处为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