我知道您可以根据其他字段预填充管理表单字段。例如,我有一个slug字段,它根据标题字段自动填充。
但是,我还想根据日期进行其他自动预填充。例如,我有一个URL字段,我希望它自动设置为http://example.com/20090209.mp3,其中20090209是YYYYMMDD。
我还希望有一个文本字段,自动以“Hello my name is author”之类的东西开头,其中author是当前用户的名字。当然,我也希望这个人能够编辑该字段。关键是要做到这一点,以便用户可以更轻松地填写管理表单,而不仅仅是拥有完全自动化的字段。
答案 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 class或Widget中。然后,您需要自定义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字段。
答案 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