2011-04-16 167 views
1

我有「擴展」 Django的contrib.auth.models「用戶」,如:Django:保存時更新相關對象?

class UserProfile(models.Model): 
    user = models.ForeignKey(User, related_name = 'profile') 
    date_of_birth = models.DateField(blank=True, null=True) 
    avatar = models.ImageField(upload_to=get_avatar_path, null=True, blank=True) 
    friends = models.ManyToManyField(User, related_name = 'user_friends', blank=True, null=True) 
    bio = models.TextField(null=True, blank=True) 

我希望用戶能夠從UserChangeForm更新電子郵件,這樣的事情:

forms.py

class UserUpdateForm(UserChangeForm): 
    email = forms.EmailField() 
    def __init__(self, *args, **kwargs): 
     super(UserUpdateForm, self).__init__(*args, **kwargs) 
     self.fields.pop('username') 
     self.fields['email'].initial = self.instance.user.email 

    class Meta: 
     exclude = ('friends', 'username', 'password1', 'password2') 
     model = UserProfile 

除了一個不保存電子郵件。

我想過試圖訪問來自post_save信號的request.post數據,所以我可以在那裏設置用戶的新郵件,但不能讓那個人工作。

任何幫助表示讚賞,謝謝。

回答

1

你需要重寫形式的save方法,以及:

class UserUpdateForm(UserChangeForm): 
    email = forms.EmailField() 

    class Meta: 
     exclude = ('friends', 'username', 'password1', 'password2') 
     model = UserProfile 

    def __init__(self, *args, **kwargs): 
     super(UserUpdateForm, self).__init__(*args, **kwargs) 
     self.fields.pop('username') 
     self.fields['email'].initial = self.instance.user.email 

    def save(self, commit=True): 
     self.instance.user.email = self.cleaned_data['email'] 
     if commit: 
      self.instance.user.save() 
     super(UserUpdateForm, self).save(commit) 
+0

謝謝指點先生。你的努力應該得到回報! – jussi 2011-04-16 16:43:23