所有
我设法让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。后者仅限于适当的选择。但前两者没有标签或初始值。
有关我做错的任何建议吗?
感谢。
答案 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" ...>