2012-06-24 128 views
1

所以我在django中製作了一個通用的「帳戶」頁面。我使用了django-registration插件,目前有一個(djang標準)User對象,以及一個UserProfile和UserProfileForm對象。django編輯用戶和用戶配置文件對象

這是一個風格問題,或我認爲最佳做法。我正在計劃「正確」還是有一個「更好/推薦/標準的方式」來做到這一點?

什麼我打算做的是創建一個從request.user即用戶配置:

form = UserProfileForm(instance=User) 

(和發送該表單的視圖),並在UserProfileForm:

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 

    def __init__(self,*args,**kwargs): 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
     if kwargs.has_key('instance'): 
      self.user = kwargs['instance'] 

在我的用戶配置是相當多的,像這樣:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    points = models.IntegerField(default=0) #how is the user going with scores? 

並在用戶是的品種。

好的!編輯和保存的處理將通過mixin django的東西完成,或者更可能是因爲我沒有閱讀mixin我自己的用戶定義的視圖來處理帖子和獲取。但忽略這一點 - 因爲我確定我應該使用混合 - 是上面的「對嗎?」還是有建議?

乾杯!

回答

1

看看user profiles on the django docs,那裏列出了基本知識。你也應該看看using a form in a view

一些具體的反饋:

  • 你得到了用戶配置模型正確的,但你必須創建一個實例每次添加新用戶時(無論是通過管理界面或以編程方式在一個你視圖)。您可以通過登錄到用戶post_save信號做到這一點:

    def create_user_profile(sender, instance, created, **kwargs): 
        if created: 
         UserProfile.objects.create(user=instance) 
    post_save.connect(create_user_profile, sender=User) 
    
  • 你應該初始化的的ModelForm與UserProfile,不User的一個實例。您始終可以使用request.user.get_profile()獲取當前用戶配置文件(如果您在settings.py中定義了AUTH_PROFILE_MODULE)。你的觀點可能是這個樣子:

    def editprofile(request): 
        user_profile = request.user.get_profile() 
        if request.method == 'POST': 
         form = UserProfileForm(request.POST, instance=user_profile) 
         if form.is_valid(): 
          form.save() 
          return HttpResponseRedirect('/accounts/profile') 
        else: 
         form = UserProfileForm(instance=user_profile) 
        # ... 
    
  • 無需在您的ModelForm的初始化覆蓋。無論如何,您將用UserProfile實例調用它。如果你想創建一個新用戶,只需調用用戶構造:

    user = User() 
    user.save() 
    form = UserProfileForm(instance = user.get_profile()) 
    # ... 
    
+0

FYI今天,AUTH_PROFILE_MODULE和get_profile已被棄用 – Jay

相關問題