2011-12-15 64 views
3

如何更改Django ADMIN中DateField实例的默认控件?更改Django中日期字段的默认控件admin

我知道如何做到这一点的ModelForm - How do you change the default widget for all Django date fields in a ModelForm? - 通过提供formfield_callback检查字段类型,然后提供一个表单字段与新的小部件。

但是,我的一些ModelAdmin的可能已经有一个自定义的ModelForm,有些没有。我不想在有日期字段的地方提供/更改ModelForm(这就是要点)。

虽然可以用于子类化的自定义ModelAdmin可以。 ModelAdmin如何更改其表单的日期字段,而不管是否提供了自定义的ModelForm?

也许一个ModelAdmin用get_form()调用它的super然后设置窗体的formfield_callback?似乎有点复杂,不确定的时间,也有三件事情要注意的是,如果任何ModelAdmin需要进一步定制...

PS:我在问这个https://stackoverflow.com/questions/8484811/jquery-datepicker-in-django-admin后被错误地关闭是一个“确切的复制“上述ModelForm问题。我希望现在的区别很明显。

顺便说一句,我个人的动机是Django管理员的默认日期选择器的年份导航。对于生日来说真的很糟糕:-)是的,这是一张三年老票https://code.djangoproject.com/ticket/9388

回答

1

ModelAdmin只能更改它呈现的窗体的窗口小部件,所以很难覆盖传递给自定义窗体的窗口小部件它 - 至少我想不出一个干净的方式来做到这一点。

我可以看到一些选项,具体取决于你想要如何定制。

  1. 修改为widget创造魔力的javascript。这似乎很容易,如果您可以在那里处理您的更改。只需提供您自己的js/calendar.jsjs/admin/DateTimeShortcuts.js即可覆盖管理员模板。这有助于升级友好的额外好处;因为你没有修改Django的代码库;对于使用该小部件的所有表单也会立即进行更改。

  2. 自定义内置的Django小部件来做你想做的。这有利于即时工作,而不需要对现有代码进行任何修改,但是除非您谨慎修补源代码,否则无法升级。源代码位于django.contrib.admin.widgets

  3. 提供您自己的自定义小部件 - 但之后您又回到了通过代码并手动覆盖所有自定义小部件实例的问题。

  4. 使用类似grappelli的东西,并修改模板/ js做你想做的。这里额外的好处是您可以免费获得许多其他功能(例如,如果您使用django-admin-tools即可拥有仪表板,则可以使用其他功能)。

的Django在其管理使用jQuery的广泛,他们有自己的jQuery的命名空间(django.jQuery);所以如果你打算做一些自定义小部件,请确保使用正确的命名空间来避免奇怪的问题。

+0

谢谢你。这个项目确实在使用grappelli。鉴于这是一个真正的javascript问题(“日历不够好”),我会选择1.并以这种方式更改日历。 –

+0

@BurhanKhalid位于默认JavaScript的位置在哪里? –