当前位置:  开发笔记 > 后端 > 正文

如何修改Django中某种类型的所有内置表单字段的默认小部件?

如何解决《如何修改Django中某种类型的所有内置表单字段的默认小部件?》经验,为你挑选了1个好方法。

这是关于如何更改ModelForm中所有Django日期字段的默认小部件的后续内容?.

假设您有大量模型(例如A-ZZZ)随着您无法控制的其他开发人员的输入而增长,并且您希望更改所有日期字段的输入方式(即使用jQueryUI).确保使用新窗口小部件填写所有日期字段的最佳方法是什么?

引用问题的一个建议是:

def make_custom_datefield(f):
   if isinstance(f, models.DateField):
       # return form field with your custom widget here...
   else:
       return f.formfield()

class SomeForm(forms.ModelForm): 
   formfield_callback = make_custom_datefield

   class Meta:
       # normal modelform stuff here...

但是,如果您没有明确的ModelForm,这可能会发生吗?但是url模式直接来自模型吗?即你的网址配置是likeo:

url(r'^A/?$', 'list_detail.object_list', SomeModelA)

其中SomeModelA是Django在后台变成ModelForm的模型(不是表单).

目前在我的系统中,每个模型都没有表格.明确创建表单的唯一方法是添加先前解决方案中建议的formfield_callback,但这违反了DRY原则,并且容易出错并且需要大量人力.

我已经考虑过(正如在最后一个帖子中所建议的)创建我自己的字段,该字段具有特殊的小部件并使用它而不是内置的.它不是那么费力,但它可能会出错(但没有好的grep无法修复).

建议和想法表示赞赏.



1> Jarret Hardi..:

听起来你想在整个项目范围内这样做(即:在某些情况下,你不是试图这样做,但在你正在运行的应用程序的所有情况下).

一种可能性是替换DateField类本身的widget属性.您需要在某个中心位置执行此操作...保证由django应用程序的每个运行实例加载.中间件可以帮助解决这个问题.否则,只需将其放在__init__您的应用程序的文件中.

您要做的是为forms.DateField类本身重新分配widget属性.当创建新的DateField时,Django会检查代码是否指定了字段属性定义中的任何特定小部件.如果不是,它使用DateField的默认值.我假设如果您的场景中的用户确实定义了特定的小部件,那么即使您对全局API进行了更改,也要保证这一点.

尝试将此作为强制默认为其他小部件的示例...在本例中为HiddenInput:

from django import forms
forms.DateField.widget = forms.HiddenInput

class Foo(forms.Form):
    a = forms.DateField()

f = Foo()
print f.fields['a'].widget
# results in 

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有