1
私はipts
というフィールドを持つDjangoフォームを持っています。デフォルトではコンテンツはchoices=(('', '-'*20),)
です。Django UpdateViewはフォームフィールドの選択肢を拡張します
UpdateView
では、このリストをさらに多くのオプションで拡張します。 したがって、get_context_data
に私はフォームを取得し、そのリストを拡張します。
choices = form.fields['ipts'].choices
choices = choices.extend([('IPTS-123', 'IPTS-454545'),])
は
render_to_response
方法で、私は
form.fields['ipts'].choices
を印刷し、選択肢がうまく移入されたことを確認するには、私は私が期待していたものを持っている:テンプレートはこれらの選択肢が取り込まれていないが
[('', '--------------------'), ('IPTS-123', 'IPTS-454545')]
! ('', '--------------------')
クラスベースビューで選択肢フィールドを拡張する方法はありますか?
提案は大歓迎です。ありがとう。
編集:ここ
ビューコード:
class ProfileReductionUpdate(LoginRequiredMixin, SuccessMessageMixin,
UpdateView):
'''
'''
model = UserProfile
form_class = UserProfileReductionForm
template_name = 'users/profile_reduction_form.html'
# fields = '__all__'
success_url = reverse_lazy('index')
success_message = "Your Profile for the Reduction was updated successfully."
def get(self, request, *args, **kwargs):
print("*** get")
return super(ProfileReductionUpdate, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
print("*** get_context_data")
context = super(ProfileReductionUpdate, self).get_context_data(**kwargs)
from pprint import pprint
# pprint(context)
import copy
form = context['form']
print("Form:")
pprint(form)
choices = form.fields['ipts'].choices
choices = choices.extend([('IPTS-123', 'IPTS-454545'),])
pprint(form.fields['ipts'].choices)
# form.fields['ipts'].choices = choices
context['form'] = form
pprint(context['form'].fields['ipts'].choices)
return context
def render_to_response(self, context, **response_kwargs):
print("*** render_to_response")
from pprint import pprint
pprint(context)
pprint(response_kwargs)
form = context['form']
print("Form:")
pprint(form)
print("Form ipts choices:")
pprint(form.fields['ipts'].choices)
pprint(form.fields['ipts']._choices)
# pprint(dir(form.fields['ipts']))
return super(ProfileReductionUpdate, self).render_to_response(context, **response_kwargs)
ここ出力:
*** get
[22/Nov/2017 10:22:14] DEBUG [server.apps.users.models:60] QuerySet
*** get_context_data
Form:
<UserProfileReductionForm bound=False, valid=Unknown, fields=(ipts;experiment)>
[('', '--------------------'), ('IPTS-123', 'IPTS-454545')]
[('', '--------------------'), ('IPTS-123', 'IPTS-454545')]
*** render_to_response
{'form': <UserProfileReductionForm bound=False, valid=Unknown, fields=(ipts;experiment)>,
'object': <UserProfile: rhf>,
'userprofile': <UserProfile: rhf>,
'view': <server.apps.users.views.ProfileReductionUpdate object at 0x7f0d29d14b70>}
{}
Form:
<UserProfileReductionForm bound=False, valid=Unknown, fields=(ipts;experiment)>
Form ipts choices:
[('', '--------------------'), ('IPTS-123', 'IPTS-454545')]
[('', '--------------------'), ('IPTS-123', 'IPTS-454545')]
編集2:
フォーム:
class UserProfileReductionForm(forms.ModelForm):
'''
'''
def __init__(self, *args, **kwargs):
super(UserProfileReductionForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_class = 'form-horizontal'
self.helper.layout.append(Submit('submit', 'Save'))
self.helper.layout.append(Button('cancel', 'Cancel',
css_class='btn-default',
onclick="window.history.back()"))
class Meta:
model = UserProfile
# exclude = ['user']
fields = ['ipts', 'experiment']
モデル:
ipts = models.CharField(
"Integrated Proposal Tracking System (IPTS)",
max_length=20,
blank=True,
choices=(('', '-'*20),)
テンプレートを表示できますか? – scharette
そして残りのビューコード。 –
テンプレートはシンプルです。「{%crispy form%}」と{{%csrf_token%} {{form}} 'の両方で同様の結果を試しました。 – RicLeal