web-dev-qa-db-ja.com

初期設定Django __ init__メソッドのフォームフィールド値

Django 1.6

以下に示すように、Djangoフォームクラスにコードの作業ブロックがあります。フォームフィールドリストを作成するデータセットには、任意のフィールドの初期値を含めることができます。フォームにその初期値を設定することに成功していません。以下の_if field_value:_ブロックは、実際に初期フォーム辞書属性を設定しますが、初期値は表示されていません。 _.initial_属性は、super()呼び出しの後まで存在しません。

これはできますか?

もしそうなら、この仕事をするために私が正しくしていないことは何ですか?

ありがとう!

_def __init__(self, *args, **kwargs):
    id = kwargs.pop('values_id', 0)
    super(LaunchForm, self).__init__(*args, **kwargs)
    # Lotsa code here that uses the id value
    # to execute a query and build the form
    # fields and their attributes from the 
    # result set

    if field_value:
        self.initial[field_name] = field_value
_
32
Steve Sawyer

私はまったく同じ問題を抱えていて、これを解決しました:

def __init__(self, *args, **kwargs):
    instance = kwargs.get('instance', None)

    kwargs.update(initial={
        # 'field': 'value'
        'km_partida': '1020'
    })

    super(ViagemForm, self).__init__(*args, **kwargs)

    # all other stuff

この方法を試してください:

super(ViagemForm, self).__init__(*args, **kwargs)

if field_value:
    #self.initial[field_name] = field_value
    self.fields[field_name].initial = field_value
21
ndpu

これはあなたの問題を解決しないかもしれませんが、フォームに送信された「初期の」dict kwargが_field['field_name'].initial_よりも優先されるように見えることに言及したいと思います。

_class MyView(View):
    form = MyForm(initial={'my_field': 'first_value'})

class MyForm(Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['my_field'].initial = 'second_value'
_

_my_field_レンダリングの初期設定は_'first_value'_に設定されます。

いくつかのオプション(特に)は次のとおりです。

フォームを初期化する前に、ビューで_second_value_を決定します。

_class MyView(View):
    # determine second_value here
    form = MyForm(initial={'my_field': 'second_value'})
_

super()を呼び出す前に、initialで_first_value_を_second_value_に置き換えます。

_class MyForm(Form):
    def __init__(self, *args, **kwargs):
        # determine second_value here
        if kwargs.get('initial', None):
            kwargs['initial']['my_field'] = 'second_value'
        super().__init__(*args, **kwargs)
_

super()を呼び出す前に、_'first_value'_が_kwargs['initial']_にないことを確認してください。

_class MyForm(Form):
    def __init__(self, *args, **kwargs):
        if kwargs.get('initial', None):
            if kwargs['initial']['my_field']
                del(kwargs['initial']['my_field']
        super().__init__(*args, **kwargs)
        # determine second_value here
        self.fields['my_field'].initial = 'second_value'
_
4
Megan Word

これは動作します:

class BarForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['state'] = forms.ChoiceField(
            required=False,
            choices=Foo.ADDRESS_STATE_CHOICES,
            disabled='disabled',
            initial='xyz',
        )

    state = forms.ChoiceField(
        label='State',
        choices=Foo.ADDRESS_STATE_CHOICES,
        initial='foo',
    )
0
Julio Marins

「needs_response」というラジオボタンの初期値を設定する際に同様の問題が発生し、自己の属性を調べて「declared_fields」を参照することで解決しました。

    # views.py
    def review_feedback_or_question(request, template, *args, **kwargs):
        if 'fqid' in kwargs:
            fqid = kwargs['fqid']
        submission = FeedbackQuestion.objects.get(pk=fqid)
        form = FeedbackQuestionResponseForm(submission_type=submission.submission_type)
        # other stuff

    # forms.py
    class FeedbackQuestionResponseForm(forms.Form):
        CHOICES = (('1', 'Yes'), ('2', 'No'))
        response_text = forms.CharField(
            required=False,
            label='',
            widget=forms.Textarea(attrs={'placeholder': 'Enter response...'}))
        needs_response = forms.ChoiceField(choices=CHOICES,
            label='Needs response?',
            widget=forms.RadioSelect())
        def __init__(self, *args, **kwargs):
            if 'submission_type' in kwargs:
                submission_type = kwargs.pop('submission_type')
                if submission_type == 'question':
                    self.declared_fields['needs_response'].initial = 1
                else:
                    self.declared_fields['needs_response'].initial = 2
            super(FeedbackQuestionResponseForm, self).__init__(*args, **kwargs)
0
Ray