2014-05-18 2 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

관련 문제