Ho un campo multivalore con un campo di battaglia e un campo di scelta. Devo passare delle scelte al costruttore del campo di scelta, tuttavia quando provo a passarlo nel mio multivalore personalizzato, ottengo un errore __init__()
ottenuto un '"opzione" di parole chiave inaspettate.Django MultiValueField - Come passare le scelte a ChoiceField?
So che il resto del codice funziona perché quando rimuovo l'argomento della parola chiave scelte da __init__
e super, il campo multivalore viene visualizzato correttamente ma senza alcuna scelta.
è così che ho installato il mio personalizzato 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)
E io lo chiamo in questo modo:
input_and_choice = InputAndChoiceField(choices=[(1,'first'),(2,'second')])
Quindi, come faccio a passare le scelte per il mio campo ChoiceField?
Edit:
Ho provato il suggerimento di stefanw ma ancora fortuna. Ho usato logging.debug per stampare il contenuto di InputAndChoiceField alla fine di init e self.fields [1] .choices contiene i valori corretti come sopra, tuttavia non visualizza alcuna scelta nel browser.
Ho appena provato questo, ma ho ancora un campo di scelta vuoto. Ho controllato e le scelte sono passate correttamente però. qualche idea? –
Sembra che si debba costruire un oggetto 'fields' prima di chiamare il costruttore di MultiValueField, e quindi passare quel valore 'fields' nel primo parametro del contructor della superclasse. – mjumbewu