模特:
class Status(models.Model):
status = models.CharField(max_length=40, blank=False, )
@classmethod
def get_status_list(self):
status_list = list()
status_list.append(('', 'no selected'))
for values_ins in Status.objects.all().values_list('id', 'status'):
status_list.append(values_ins)
return status_list
class UserProfile(User):
name1 = models.CharField('Имя', max_length=30, blank=True, null=True, )
name2 = models.CharField('Отчество', max_length=30, blank=True, null=True, )
status = models.ForeignKey(Status, verbose_name='Статус', blank=True, null=True, )
形式:
class PersonalDataForm(forms.ModelForm):
status = forms.ChoiceField(widget=forms.Select, choices=Status.get_status_list(),label='Статус',required=False, )
class Meta:
model = UserProfile
fields = ('name1', 'name2', )
观点:
@login_required
def personal_data_page(request):
entry_user_profile = UserProfile.objects.get(user_ptr_id=request.user.id)
form = PersonalDataForm(instance=entry_user_profile)
if request.method == 'POST':
form = PersonalDataForm(request.POST, instance=entry_user_profile)
if form.is_valid():
form.save()
entry_user_profile.save()
return HttpResponseRedirect('/userprofile/personal_data_page_changed/')
t = loader.get_template('personal_data_page.html')
c = RequestContext(request, {'form': form,})
return HttpResponse(t.render(c))
模板:
{{ form.name1 }}
{{ form.name2 }}
{{ form.status }}
问题是首先加载表单,用户可以在字段中看到数据库中的数据:" name1"," name2"。但是没有在" status"中看到数据库中的数据。 (它显示了一个点"没有选择",但必须显示与表UserProfile.status_id中的值对应的项目)
我需要在第一次加载表格的状态"状态"表示一定的价值。请帮忙
答案 0 :(得分:1)
您正在使用模型表单但是您已覆盖表单中的状态字段,因此您需要通过覆盖__init__
方法手动设置初始值(一种方法,可以在其他方式):
class PersonalDataForm(forms.ModelForm):
status = forms.ChoiceField(
widget=forms.Select,
choices=Status.get_status_list(),
label='Статус',
required=False
)
def __init__(self, *args, **kwargs):
super(PersonalDataForm, self).__init__(*args, **kwargs)
self.fields["status"].initial = self.instance.status.id # this line sets the value
class Meta:
model = UserProfile
fields = ('name1', 'name2', )
以下是对其他代码的一些改进。
简化get_status_list
方法:
@classmethod
def get_status_list(self):
status_list = Status.objects.all().values_list('id', 'status')
status_list.insert(0, ('', 'no selected'))
return status_list
entry_user_profile.save()
之后您无需form.save()
。表单save方法将默认返回更新的配置文件实例。所以遵循以下两行:
form.save()
entry_user_profile.save()
简化为:
entry_user_profile = form.save()