2016-02-29 29 views
1

在我的Django項目中,我創建了一個應用程序以獲得有關已註冊用戶的其他信息。所以,我的模式是這樣的:Django - ModelForm來自數據庫的初始數據

class UserProfile(models.Model): 
    class Meta: 
     verbose_name_plural = u'User Profile' 

    user = models.OneToOneField(User) 
    birthday = models.DateField(blank=True, null=True) 
    avatar = models.ImageField(upload_to='media/profile/avatar', blank=True, null=True) 
    name = models.CharField(blank=True, null=True, max_length=20) 
    surname = models.CharField(blank=True, null=True, max_length=50) 
    phone = models.CharField(blank=True, null=True, max_length=12) 

    def __unicode__(self): 
     return '%s' % self.user 

在用戶配置文件我創建的ModelForm在那裏用戶可以填寫或編輯從用戶配置模型的字段:

class ExtraProfileDataForm(ModelForm): 
    name = forms.CharField(label=(u'Enter your name')) 
    surname = forms.CharField(label=(u'Enter your surname')) 
    phone = forms.CharField(label=(u'Enter your phone')) 
    birthday = forms.DateField(label=(u'Enter birthday')) 
    avatar = forms.ImageField(label=(u'Enter avatar')) 

    class Meta: 
     model = UserProfile 
     fields = ('name', 'surname', 'phone', 'birthday', 'avatar') 

    def __init__(self, *args, **kwargs): 
     super(ExtraProfileDataForm, self).__init__(*args, **kwargs) 
     for key in self.fields: 
      self.fields[key].required = False 

這是模型形式的看法:

@login_required 
def UserFullDataForm(request): 
    if request.method == 'POST': 
     form = ExtraProfileDataForm(request.POST) 
     if form.is_valid(): 
      profile_user = request.user 
      user_profile = UserProfile(user=profile_user) 
      user_profile.name = form.cleaned_data['name'] 
      user_profile.surname = form.cleaned_data['surname'] 
      user_profile.phone = form.cleaned_data['phone'] 
      user_profile.birthday = form.cleaned_data['birthday'] 
      user_profile.avatar = form.cleaned_data['avatar'] 
      user_profile.save() 
      return HttpResponseRedirect('/profile/') 
      else: 
      return render(request, 'profiles/extra_profile.html', {'form':form}) 
     else: 
      form = ExtraProfileDataForm() 
      context = {'form':form} 
      return render (request, 'profiles/extra_profile.html', context) 

但我想加載ExtraProfileDataForm來自型號UserProfile的初始數據,如果字段不爲空。我搜索瞭如何在Django文檔網站上做到這一點,但沒有發現。有人可以幫助我理解如何做到這一點嗎?非常感謝。

回答

3

您使用instance參數。

請注意,你在這裏做的工作要多得多;你的大部分觀點都可以被削減。

@login_required 
def UserFullDataForm(request): 
    try: 
     profile = request.user.userprofile 
    except UserProfile.DoesNotExist: 
     profile = UserProfile(user=request.user) 

    if request.method == 'POST': 
     form = ExtraProfileDataForm(request.POST, instance=profile) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/profile/') 
     else: 
      form = ExtraProfileDataForm(instance=profile) 
     return render(request, 'profiles/extra_profile.html', {'form':form}) 

同樣,在你的表格,你不需要重寫__init__方法,因爲你手動指定的所有字段無妨;你可以在那裏添加required=False。但是,通過在型號定義中添加標籤,可以使其更短。那麼你的整個模型可能只是:

class ExtraProfileDataForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('name', 'surname', 'phone', 'birthday', 'avatar') 

最後一點:你一直在使用三空間縮進,這有點奇怪。大多數Python程序員更喜歡兩個或四個。

+0

非常感謝!我在另一篇文章中找到了你的答案。 http://stackoverflow.com/a/7350469/4592608 –

相關問題