django - 向MultiValueField / MultiWidget的字段添加属性

时间:2012-04-05 07:48:54

标签: django django-forms django-multiwidget

所有

我设法让MultiValueField和MultiValueWidget工作。但是,除了“选择”之外,我似乎无法在构成MultiValueField的子字段中添加属性(如“label”或“initial”)。

这是我的(简化)代码:

class MyMultiWidget(django.forms.widgets.MultiWidget):
    def __init__(self,*args,**kwargs):
        myChoices = kwargs.pop("choices",[])
        widgets = (
            django.forms.fields.TextInput(),
            django.forms.fields.TextInput(),
            django.forms.fields.Select(choices=myChoices),
        )
        super(MyMultiWidget, self).__init__(widgets,*args,**kwargs)        

class MyMultiValueField(django.forms.fields.MultiValueField):
    widget = MyMultiWidget

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

        myLabel = "my label"
        myInitial = "my initial value"
        myChoices = [("a","a"),("b","b")]

        fields = (
            django.forms.fields.CharField(label=myLabel),
            django.forms.fields.CharField(initial=myInitial),
            django.forms.fields.ChoiceField(choices=myChoices),
        )
        super(MyMultiValueField,self).__init__(fields,*args,**kwargs)
        self.widget=MyMultiWidget(choices=myChoices)

class MyField(models.Field):

    def formfield(self,*args,**kwargs):
        return MyMultiValueField()

class MyModel(django.models.Model):
    myField = MyField(blank=True)

MyForm = modelform_factory(MyModel)

MyModel的“myField”字段在MyForm中几乎正确呈现;它显示了三个小部件:两个TextInput和一个Select。后者仅限于适当的选择。但前两者没有标签或初始值。

有关我做错的任何建议吗?

感谢。

3 个答案:

答案 0 :(得分:2)

您应该定义Widget的format_output功能 - 请参阅:https://docs.djangoproject.com/en/dev/ref/forms/widgets/

这使您可以按照自己喜欢的方式格式化表单html。我认为默认只是连接字段元素。

答案 1 :(得分:0)

ben提供的答案有点hacky,我会使用'attrs'传递初始值:

forms.TextInput(attrs={'value': 'some text'})

有趣的是,某些属性似乎正确传递 - 例如在我的情况下设置CharField上的'max_length'。

答案 2 :(得分:0)

@george是正确的,可以静态定义value,但是您也可以覆盖get_context以在运行时确定值。

class MyInput(forms.CharField):
    def get_context(self, name, value, attrs):
        return super().get_context('some_name', 'some_value', attrs)

将渲染

<input type="text" name="some_name" value="some_value" ...>