2017-03-12 3 views
3

ich eine dynamische Form geschrieben:use_required_attribute() 1 erforderlich Positions Argument fehlt: 'initial' django bildet

class VoteForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     question = kwargs.pop('instance', None) 
     super().__init__(*args, **kwargs) 

     if question: 
      if question.allow_multiple_votes: 
       choice_field = forms.ModelMultipleChoiceField(queryset=question.choice_set) 
      else: 
       choice_field = forms.ModelChoiceField(queryset=question.choice_set) 
      choice_field.widget = forms.RadioSelect 
      choice_field.label=False 
      choice_field.empty_label=None 
      choice_field.error_messages={'required': _('No choice selected.'), 
             'invalid': _('Invalid choice selected.')} 
      self.fields['choice'] = choice_field 

Ohne die RadioSelect Widget alles scheint zu funktionieren, aber mit ihm, der folgenden Fehler auftritt:

TypeError: use_required_attribute() missing 1 required positional argument: 'initial'

+2

Wie wäre es, wenn Sie 'choice_field.initial =" some_value "' setzen? –

Antwort

2

Wenn Sie das Widget nach dem Erstellen des Felds festlegen, muss es eine Widget-Instanz sein, nicht die Klasse selbst. Aber Sie haben die Wahl selbst einstellen:

choice_field.widget = forms.RadioSelect(choices=...) 

Vorzugsweise können Sie die Widget-Klasse geben, wenn Sie Ihr Feld konstruieren:

choice_field = forms.ModelChoiceField(queryset=question.choice_set, widget=forms.RadioSelect) 
2

Das Wichtigste zuerst, Sie haben (vorausgesetzt, ein Tippfehler) Fehler in der Widget-Deklaration. Sie müssen eine Instanz der Klasse RadioSelect als Widget:

choice_field.widget = forms.RadioSelect() 

Dann Sie manuell den initial Wert einstellen.
Sie können eine von zwei Optionen wählen, das zu tun:

Option 1:

Set initial in Form Instanziierung:

if question.allow_multiple_votes: 
      choice_field = forms.ModelMultipleChoiceField(
       queryset=question.choice_set, 
       initial=0 
      )  
     else: 
      choice_field = forms.ModelChoiceField(
       queryset=question.choice_set 
       initial=0 
      ) 

Option 2:

das Set initial Attribut: choice_field.initial=0 (wie @nik_m in den Kommentaren hervorhebt)


Mit initial=0 das erste Element des queryset ausgewählt.

Verwandte Themen