Django MultiValueField - 如何将选择传递给 ChoiceField?
我有一个带有 charfield 和 choicefield 的多值字段。我需要将选择传递给 choicefield 构造函数,但是当我尝试将其传递到自定义多值字段时,我收到错误 __init__()
获得了意外的关键字参数“choices”。
我知道代码的其余部分有效,因为当我从 __init__
和 super 中删除choices关键字参数时,多值字段显示正确,但没有任何选择。
这就是我设置自定义多值字段的方式:
class InputAndChoice(object):
def __init__(self, text_val='', choice_val=''):
self.text_val=text_val
self.choice_val=choice_val
class InputAndChoiceWidget(widgets.MultiWidget):
def __init__(self, attrs=None):
widget = (widgets.TextInput(),
widgets.Select()
)
super(InputAndChoiceWidget, self).__init__(widget, attrs=attrs)
def decompress(self,value):
if value:
return [value.text_val, value.choice_val]
return [None, None]
class InputAndChoiceField(forms.MultiValueField):
widget = InputAndChoiceWidget
def __init__(self, required=True, widget=None, label=None, initial=None,
help_text=None, choices=None):
field = (
fields.CharField(),
fields.ChoiceField(choices=choices),
)
super(InputAndChoiceField, self).__init__(fields=field, widget=widget,
label=label, initial=initial, help_text=help_text, choices=choices)
我这样称呼它:
input_and_choice = InputAndChoiceField(choices=[(1,'first'),(2,'second')])
那么如何将选项传递到我的 ChoiceField 字段?
编辑:
我已经尝试过 stefanw 的建议,但仍然没有成功。我已经使用logging.debug在init和self.fields[1].choices末尾打印出InputAndChoiceField的内容,其中包含如上所述的正确值,但它不会在浏览器中显示任何选择。
I have a multivaluefield with a charfield and choicefield. I need to pass choices to the choicefield constructor, however when I try to pass it into my custom multivaluefield I get an error __init__()
got an unexpected keyword argument 'choices'.
I know the rest of the code works because when I remove the choices keyword argument from __init__
and super, the multivaluefield displays correctly but without any choices.
This is how I setup my custom multivaluefield:
class InputAndChoice(object):
def __init__(self, text_val='', choice_val=''):
self.text_val=text_val
self.choice_val=choice_val
class InputAndChoiceWidget(widgets.MultiWidget):
def __init__(self, attrs=None):
widget = (widgets.TextInput(),
widgets.Select()
)
super(InputAndChoiceWidget, self).__init__(widget, attrs=attrs)
def decompress(self,value):
if value:
return [value.text_val, value.choice_val]
return [None, None]
class InputAndChoiceField(forms.MultiValueField):
widget = InputAndChoiceWidget
def __init__(self, required=True, widget=None, label=None, initial=None,
help_text=None, choices=None):
field = (
fields.CharField(),
fields.ChoiceField(choices=choices),
)
super(InputAndChoiceField, self).__init__(fields=field, widget=widget,
label=label, initial=initial, help_text=help_text, choices=choices)
And I call it like so:
input_and_choice = InputAndChoiceField(choices=[(1,'first'),(2,'second')])
So how do I pass the choices to my ChoiceField field?
Edit:
I've tried stefanw's suggestion but still no luck. I've used logging.debug to print out the contents of InputAndChoiceField at the end of the init and self.fields[1].choices contains the correct values as per above however it doesnt display any choices in the browser.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我遇到了这个完全相同的问题并像这样解决了它:
将“choices”kwarg 添加到小部件的构造函数中。然后在创建字段后显式调用构造函数。
I ran into this exact same problem and solved it like this:
Add a "choices" kwarg to the widget's constructor. Then explicitly call the constructor after the field is created.
ModelChoiceField
是从技术上讲,它是一个ChoiceField
,但它实际上并未使用ChoiceField
的任何实现。所以,这就是我的使用方法。ModelChoiceField
is technically aChoiceField
, but it doesn't actually use any of theChoiceField
's implementations. So, here's how I use it.看看
forms.MultiValueField
的__init__
的来源:所以我会像这样覆盖
__init__
:你甚至可能想做
super(MultiValueField, self).__init__(*args, **kwargs)
而不是super(InputAndChoiceField, self).__init__(*args, **kwargs)
因为你自己设置字段而不是通过参数获取它们。Have a look at the source of
__init__
offorms.MultiValueField
:So I would overwrite the
__init__
probably like this:You might even want to do
super(MultiValueField, self).__init__(*args, **kwargs)
instead ofsuper(InputAndChoiceField, self).__init__(*args, **kwargs)
because you are setting the fields yourself instead of getting them via parameters.传递小部件中的选择为我解决了这个问题
passing the choices in the widget solved this for me