2014-05-18 39 views
2

請幫忙,表單首先加載在表單域中顯示來自數據庫的數據。如何填寫表格初始資料?

型號:

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」。但沒有在「狀態」中看到數據庫中的數據(它顯示一個點「沒有選擇」,但必須顯示與表UserProfile.status_id中的值對應的項)

我需要當你第一次加載表單中的「狀態」表示一定的值。請幫助

回答

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 

你不需要form.save()後有entry_user_profile.save()。方法save默認情況下會返回更新後的配置文件實例。所以,下面兩行:

form.save() 
entry_user_profile.save() 

簡化爲:

entry_user_profile = form.save() 
+0

感謝。但entry_user_profile = form.save()不保存值( – user3607370