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
_
私はまったく同じ問題を抱えていて、これを解決しました:
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
これはあなたの問題を解決しないかもしれませんが、フォームに送信された「初期の」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'
_
これは動作します:
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',
)
「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)