【问题标题】:Django - How to prepopulate admin form fieldsDjango - 如何预填充管理表单字段
【发布时间】:2010-10-06 12:07:27
【问题描述】:

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

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

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

【问题讨论】:

  • 任何尝试预填充外键的人,请使用 id 而不是 value。

标签: python django django-admin django-forms


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

我最近为此使用了 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 时,您应该小心副作用。

【讨论】:

    【解决方案3】:

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

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

    这种管理员黑客攻击几乎总是可能的,但(正如您从这个令人费解的摘要中可以看出的那样)很少简单,特别是如果您正在努力使您的代码得到很好的封装。

    【讨论】:

      【解决方案4】:

      您可以通过使用您选择的表单字段替换默认的 django 管理字段来覆盖它。

      检查这个: Add custom validation to the admin

      【讨论】:

        【解决方案5】:

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

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

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

        类似: models.CharField(max_length=250, default="默认文本")

        【讨论】:

        • 我认为这不符合要求。这个想法是根据刚刚输入的另一个字段的值预先填充一个字段,所有这些都在 Javascript 中。服务器端的可调用默认值对此无济于事。
        • @Carl - 这是有道理的,我只是没有那样读。谢谢。
        【解决方案6】:

        我尝试了其中一些答案,但都没有奏效。我只是想用相关模型中的另一个字段来预置一个字段。以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
        

        【讨论】:

          【解决方案7】:

          slug 处理是用 javascript 完成的。

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

          【讨论】:

            猜你喜欢
            • 2019-10-22
            • 1970-01-01
            • 2017-03-27
            • 2013-06-22
            • 1970-01-01
            • 2019-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多