Django中的formfield()方法何时被调用?
这是一个关于在Django中创建自定义字段的问题。我正在制作一个叫做 EditAreaField
的字段,它是从 TextField
继承来的。我的代码大概是这样的:
class EditAreaField(models.TextField):
description = "A field for editing the HTML of a page"
def formfield(self, **kwargs):
defaults = {}
defaults['widget'] = EditArea() # setting a new widget
defaults.update(kwargs)
return super(EditAreaField, self).formfield(**defaults)
在第5行,我给这个字段分配了一个自定义的控件。在第6行,我更新了一些参数。
问题是,Django会发送一个名为 widget
的参数,它被设置为 django.contrib.admin.widgets.AdminTextareaWidget
,这会覆盖我设置的 EditArea() 控件。
我该如何改变Django设置的这个值呢?显然,我可以通过交换第5行和第6行来覆盖他们的设置,这样我的代码看起来就像:
defaults.update(kwargs)
defaults['widget'] = EditArea() # override django here
但这样做真的是最好的方法吗?
顺便提一下,我在Django的网站上找不到关于formfield()函数的文档:这个函数是不是被弃用了?
1 个回答
3
看起来,formfield
方法是由 ModelForm
助手调用的。根据文档,formfield
方法应该只包含一个 form_class
属性,用来指向这个自定义模型字段的表单字段类。这个类可以是自定义的(或者是默认的)表单字段类,默认的小部件就是在这里定义的。
from myapp.forms import MyCustomFormField
#create a custom model field
class EditAreaField(models.TextField):
def formfield(self, **kwargs):
defaults={'form_class': MyCustomFormField}#pass our custom field as form_class
defaults.update(kwargs)
return super(EditAreaField, self).formfield(**defaults)