gpt4 book ai didi

Django MultiValueField - 如何将选择传递给 ChoiceField?

转载 作者:行者123 更新时间:2023-12-01 16:24:48 49 4
gpt4 key购买 nike

我有一个带有 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的内容。choices包含如上所述的正确值,但它不会在浏览器中显示任何选择。

最佳答案

我遇到了完全相同的问题并像这样解决了它:

class InputAndChoiceWidget(widgets.MultiWidget):
def __init__(self,*args,**kwargs):
myChoices = kwargs.pop("choices")
widgets = (
widgets.TextInput(),
widgets.Select(choices=myChoices)
)
super(InputAndChoiceWidget, self).__init__(widgets,*args,**kwargs)

class InputAndChoiceField(forms.MultiValueField):
widget = InputAndChoiceWidget

def __init__(self,*args,**kwargs):
# you could also use some fn to return the choices;
# the point is, they get set dynamically
myChoices = kwargs.pop("choices",[("default","default choice")])
fields = (
fields.CharField(),
fields.ChoiceField(choices=myChoices),
)
super(InputAndChoiceField,self).__init__(fields,*args,**kwargs)
# here's where the choices get set:
self.widget = InputAndChoiceWidget(choices=myChoices)

将“choices”kwarg 添加到小部件的构造函数中。然后在创建字段后显式调用构造函数。

关于Django MultiValueField - 如何将选择传递给 ChoiceField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1617454/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com