0

ウィジェットが1つしかないdjangoフォームクラスがあります。このウィジェットに次のように名前を付けたい<select name="custom_name"></select>のですが、Django は変数の名前を取り、ウィジェットに名前として付けます。例えば:

class MultiSelectForm(forms.Form):
    here_is_the_name_of_the_widget = forms.MultipleChoiceField()

したがって、上記のコードは次の名前のウィジェットを作成します。

<select name="here_is_the_name_of_the_widget">...</select>

フォームのプロトタイプを作成する必要があるため、初期化時にこの名前を作成する必要があります。この時点まで、このフォームは問題なく動作しますが、事前に与えられた標準の名前を使用します。

class MultiSelectForm(forms.Form):
    multiple_select = forms.MultipleChoiceField()

    def __init__(self, attrs=None, choices=(), *args, **kwargs):            
        self.base_fields['multiple_select'].choices = choices
        self.base_fields['multiple_select'].empty_permitted = False
        self.base_fields['multiple_select'].required = kwargs.get('required', False)
        self.base_fields['multiple_select'].widget = MultiSelect(attrs=attrs, choices=choices)

        forms.Form.__init__(self, *args, **kwargs)

だから、私が望むものを達成する方法(ハック)を考えましたが、期待どおりに機能していません。ウィジェットに付けたい名前が「countries」の場合、次のエラーが発生します。

KeyError at <project_name>
'countries'

そして、そのエラーを生成するコードは次のとおりです。

class MultiSelectForm(forms.Form):
    multiple_select = forms.MultipleChoiceField()

    def __init__(self, attrs=None, choices=(), *args, **kwargs):
        default_name = 'multiple_select'

        name = attrs.get('name', default_name)
        if name != default_name:
            setattr(self, name, forms.MultipleChoiceField())
            del attrs['name']

        '''
        The error is produced in the following line...
        '''
        self.base_fields[str(name)].choices = choices
        self.base_fields[str(name)].empty_permitted = False
        self.base_fields[str(name)].required = kwargs.get('required', False)
        self.base_fields[str(name)].widget = MultiSelect(attrs=attrs, choices=choices)

        forms.Form.__init__(self, *args, **kwargs)

それを達成する方法、またはより良い方法はありますか?

ありがとう!

これが解決策です...

@Daniel Rosemanに感謝

class MultiSelectForm(forms.Form):
    def __init__(self, attrs=None, choices=(), *args, **kwargs):
        #empty_permitted is a Form's attribute
        kwargs['empty_permitted'] = False
        forms.Form.__init__(self, *args, **kwargs)

        name = attrs.get('name', 'multiple_select')
        self.fields[name] = forms.MultipleChoiceField(
            choices=choices,
            required=kwargs.get('required', False),
            widget=MultiSelect(attrs=attrs, choices=choices)
            )
4

1 に答える 1