Django中的formfield()方法何时被调用?

2 投票
1 回答
2495 浏览
提问于 2025-04-15 17:23

这是一个关于在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)

撰写回答