Django默认查询集和ModelForm自定义字段的小部件

时间:2015-03-24 20:42:55

标签: python django

我有Site模型,我正在尝试创建一个SiteSelectorField扩展django.forms.ModelMultipleChoiceField,使用我的自定义SiteSelectorWidgetSite.objects.all()作为查询集

如果没有自定义表单字段,我的forms.py代码就像这样(并且有效):

sites = forms.ModelMultipleChoiceField(queryset=Site.objects.all(), widget=SiteSelectorWidget())

我想限制传递的参数,所以我可以这样做

sites = SiteSelectorField()

但是当我创建SiteSelectorField类时,如下所示,Django告诉我“SiteSelectorField”对象没有属性'验证器'

class SiteSelectorField(forms.ModelMultipleChoiceField):

  queryset = Site.objects.all()
  widget = SiteSelectorWidget()

  def __init__(self, *args, **kwargs):
    pass

如何为此字段指定默认查询集和窗口小部件,以便不需要传递它们?

1 个答案:

答案 0 :(得分:1)

删除def __init__方法和代码。通过在其中放置“pass”,您将覆盖您的类继承的ModelMultipleChoiceField的默认功能,该功能将使用查询集。

编辑:

重新构建__init__方法,如下所示:

  def __init__(self, *args, **kwargs):
      if not 'queryset' in kwargs:
          kwargs['queryset'] = Site.objects.all()
      return super(SiteSelectorField, self).__init__(*args, **kwargs)