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

2024-04-24 04:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我还希望有一个文本字段,自动以“Hello my name I s author”开头,其中author是当前用户的名称。当然,我也希望此人能够编辑该字段。关键是让用户可以更容易地填写管理表单,而不仅仅是让字段完全自动。


Tags: 用户name文本comhttpurlhellotitle
3条回答

Django内置的预填充字段功能是硬编码的,不能真正用于更一般的用途。

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

这种管理黑客攻击几乎总是可能发生的,但是(从这个复杂的摘要中可以看出)很少是简单的,特别是如果您正在努力使代码很好地封装起来。

我知道你可以通过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

你应该小心副作用,因为你是操纵基地场直接。

相关问题 更多 >