如何填写表格初始数据?

时间:2014-05-18 18:40:41

标签: python django

请帮助表单首先在表单字段中加载显示来自数据库的数据。

模特:

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中的值对应的项目)

我需要在第一次加载表格的状态"状态"表示一定的价值。请帮忙

1 个答案:

答案 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()