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

24 python django django-forms django-admin

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

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

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

sac*_*che 32

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

http://localhost:8000/admin/app/model/add/?model_field=hello
Run Code Online (Sandbox Code Playgroud)

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

  • 以下是这方面的文档:https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_changeform_initial_data (2认同)

bju*_*nix 19

我最近为此目的使用了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
Run Code Online (Sandbox Code Playgroud)

当您直接操作base_fields时,Yout应该注意副作用.


Car*_*yer 13

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

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

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


Til*_*ter 5

我尝试了其中的一些答案,但没有一个起作用。我只是想用相关模型中的另一个字段来预先填充一个字段。以这个答案为起点,我最终尝试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
Run Code Online (Sandbox Code Playgroud)


Mr *_*ark 2

slug 处理是通过 javascript 完成的。

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