Django,从自定义模型字段的fromfield方法传递参数到表单字段

时间:2013-03-18 01:43:36

标签: django django-models django-forms

根据documentation

  

所有kwargs字典都直接传递给表单字段的__init __()方法

def formfield(self, **kwargs):
    # This is a fairly standard way to set up some defaults
    # while letting the caller override them.
    defaults = {'form_class': MyFormField}
    defaults.update(kwargs)
    return super(HandField, self).formfield(**defaults)

如果MyFormField是:

class GeopositionField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        for name, value in kwargs.items(): # this doesn't print anything
             print name 
             print value

         self.widget = GeopositionWidget()
         fields = (
           forms.DecimalField(label=_('latitude')),
           forms.DecimalField(label=_('longitude')),
         )
         super(GeopositionField, self).__init__(fields, required=False)

如何将参数传递到表单域并在 init 方法上获取?

1 个答案:

答案 0 :(得分:0)

使用文档中的模式。创建字典并将其传递给超级formfield方法。

class GeopositionField(forms.MultiValueField):    
    #...
    def formfield(self, **kwargs):
        # get the values you want to pass to init
        defaults = {'your_kwarg_key': your_kwarg_value}
        defaults['your_other_kwarg_key'] = your_other_kwarg_value
        defaults.update(kwargs)
        return super(HandField, self).formfield(**defaults)

我认为文档并不是说formfield方法的结果传递给__init__方法,我不能在源代码中看到它发生。

我认为文档只是说所有kwargs都传递给__init__(正如您所期望的那样),因此您可以通过传递form_class参数来更改字段类__init__ - 但是,如果您想动态创建字段类,则可以覆盖formfield方法。