2011-07-25 41 views
0

我在擴展用戶模型,但似乎在使用我的新管理員表單時遇到問題。 我在models.py以下代碼:定製Django用戶模型時使用新的管理表單

class Preference(models.Model): 
     choice = models.TextField(choices = (('grid', 'grid'), ('list','list'))) 

     def __unicode__(self): 
      return self.choice 

    class UserProfile2(models.Model): 
     preference = models.ForeignKey(Preference, default = Preference.objects.get(id=2).id) 
     user = models.OneToOneField(User, unique=True) 

    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      print 'creating user profile2' 
      u = UserProfile2.objects.create(user=instance) 

    post_save.connect(create_user_profile, sender=User) 

下面的代碼是在admin.py:

class UserProfileInline(admin.TabularInline): 
     model = UserProfile2 
     fk_name = 'user' 

    class CustomUserAdmin(UserAdmin): 
     inlines = [UserProfileInline,] 

    admin.site.unregister(User) 
    admin.site.register(User, CustomUserAdmin)  

以下是settings.py:

AUTH_PROFILE_MODULE = 'userextension.UserProfile2' 

它當用戶沒有嘗試控制管理中的首選項對象的值時,可以正常工作,並使用默認值創建新用戶。但是,如果用戶試圖從「list」的默認值切換並使用「grid」,我會得到'Key user_id的重複條目'錯誤。

我是否需要顯式地從管理員表單中爲額外字段獲取值並保存userprofile2對象和用戶對象?如果是這樣,那與我收到的錯誤有什麼關係?我還沒有找到如何做到這一點的文件,並非常感謝任何方向。

更新: 這似乎也很重要:當我刪除默認值在UserProfile2模型偏好,我得到的錯誤是「列preference_id「不能爲空」

感謝您抽空看看我的問題。

回答

0

根據'created'的值,您的信號在User對象的post_save上創建一個新的UserProfile2對象。我打賭,每次調用這個信號時,'created'都是True,並且每次在admin中保存用戶對象上的任何信息時,都會嘗試創建一個新的UserProfile2對象。

UserProfile2的用戶外鍵被設置爲唯一,這是您獲取重複鍵錯誤的地方。

試着改變你的信號代碼:

def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      u = UserProfile2.objects.get_or_create(user=instance) 

應該防止重複鍵錯誤。希望能幫助你。

+0

感謝您的回答,但我上面的調試語句僅在創建新用戶時打印,而不是在現有用戶被修改時打印。所以'創造'似乎按照規範工作。 – user773328

+0

好的,那很好。我只是爲了調試而將唯一設置爲False,並查看內聯是否正在創建新記錄,或者在更改「首選項」的值時更新現有記錄。 – Brandon

相關問題