我有一个表单,其中包含一些具有初始值的字段。运行我的应用程序后,表单出现但其字段初始值不显示,只是一个空表单。
我在模板中放了{{ profile_form.initial }}
以确保表单有初始数据。它返回带有初始数据的字典:
{'local_number': 'test-local-number', 'last_name': 'test-last-name', 'phone': 'test-phone', 'zip_code': 'test-zip-code', 'city': 'test-city', 'user': <User: testuser>, 'street': 'test-street', 'first_name': 'test-first-name'}
这是我的代码:
class MyForm(forms.ModelForm):
initial_fields = ['first_name', 'last_name', 'phone', 'street',
'local_number', 'city', 'zip_code']
class Meta:
model = UserProfile
fields = ('first_name', 'last_name', 'phone', 'street',
'local_number', 'city', 'zip_code')
def __init__(self, *args, **kwargs):
self.instance = kwargs.pop('instance', None)
initial = kwargs.pop('initial', {})
for key in self.initial_fields:
if hasattr(self.instance, key):
initial[key] = initial.get(key) or getattr(self.instance, key)
kwargs['initial'] = initial
super(MyForm, self).__init__(*args, **kwargs)
def my_view(request):
context = {}
if request.user.is_authenticated():
profile_form = MyForm(
request.POST, instance=request.user.profile)
if profile_form.is_valid():
profile_form.save()
context.update({'profile_form': profile_form})
}
return render(request, 'template.html', context)
<form class="animated-form" action="" method="POST">
{% csrf_token %}
{{ profile_form.initial }}
{{ profile_form.as_p }}
<div>
<div class="row">
<div class="col-lg-12 text-center">
<button type="submit">Submit</button>
</div>
</div>
</div>
</form>
答案 0 :(得分:1)
request.POST
是一个空字典。您必须使用request.POST or None
,否则,它将被理解为“每个字段空白时提交的表单”,并且不会考虑初始化。
您也不应该在未提交的表单上调用is_valid()
。
...
profile_form = MyForm(
request.POST or None, instance=request.user.profile)
if request.method == 'POST' and profile_form.is_valid():
...