我知道您可以根据其他字段预填充管理表单字段.例如,我有一个slug字段,它根据标题字段自动填充.
但是,我还想根据日期进行其他自动预填充.例如,我有一个URL字段,我希望它自动设置为http://example.com/20090209.mp3,其中20090209是YYYYMMDD.
我还希望有一个文本字段,自动以"Hello my name is author"之类的东西开头,其中author是当前用户的名字.当然,我也希望这个人能够编辑该字段.关键是要做到这一点,以便用户可以更轻松地填写管理表单,而不仅仅是拥有完全自动化的字段.
我知道您可以通过GET预填充一些值,它将是这样的
http://localhost:8000/admin/app/model/add/?model_field=hello
我在日期字段方面遇到了一些问题,但也许这可以帮到你.
我最近为此目的使用了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应该注意副作用.
Django的内置prepopulated_fields功能被硬编码为slugify,它不能真正用于更一般的目的.
您需要编写自己的Javascript函数来进行预填充.将其包含在管理页面中的最佳方法是将其包含在自定义表单或窗口小部件的内部媒体类中.然后,您需要自定义ModelAdmin子类以使用自定义窗体或窗口小部件.最后,您需要渲染一些内联Javascript以及每个预先填充的字段以注册onchange处理程序并告诉它填充哪个其他字段; 我会通过自定义Widget渲染它.为了使其更好并且声明性,您可以使用自定义的ModelAdmin属性(类似于prepopulated_fields),并覆盖ModelAdmin.formfield_for_dbfield以创建窗口小部件并传递有关应该从哪个字段预填充的信息.
这种管理黑客攻击几乎总是可行的,但是(正如你从这个复杂的总结中可以看出的那样)很少简单,特别是如果你正在努力保持你的代码很好地封装.