2016-11-15 17 views
0

我到處搜索一個解決方案,但建議的方法要麼過時,要麼根本不工作。很奇怪,我在Django文檔中找不到明確的答案,因爲這似乎是一個非常常見的情況。'AttributeError'雖然試圖通過'post_save'中的實例爭論

我已經擴展了Django的「用戶」模型用我自己的,命名爲「USERPROFILE」,使用一到一個關係。我希望在此模型中存儲一些與用戶相關的附加數據。我創建了一個「post_save」信號處理程序來創建用戶配置文件實例,並在創建帳戶期間插入使用的其他數據

我發現,我應該能夠o使用信號一起發送的「實例」變量,但是當我試圖訪問它,我只是得到一個錯誤,說

Django的版本:1.10
異常類型:AttributeError的
異常值: '使用者' 對象有沒有屬性 '_dateofbirth'

我覈實,我可以訪問表單數據和數據庫工作正常,即使出現錯誤,也會在應用程序的「auth_user」表中創建一個條目。

我的代碼如下;我相信這個問題是存在的地方,但我不能找到它:

models.py

class Userprofile(models.Model): 
user = models.OneToOneField(settings.AUTH_USER_MODEL, 
          on_delete=models.CASCADE, 
          related_name="userprofile") 
dateofbirth = models.DateField() 
gender = models.CharField(max_length=1, choices=(
               ('M', 'Male'), 
               ('F', 'Female'))) 
height = models.IntegerField() 
weight = models.IntegerField() 
notes = models.TextField(blank=True, null=True) 

@receiver(post_save, sender=settings.AUTH_USER_MODEL, dispatch_uid="user_profile_creator") 
def create_user_profile(sender, instance, created, **kwargs): 
    dateofbirth = getattr(instance, '_dateofbirth') 
    gender = getattr(instance, '_gender') 
    height = getattr(instance, '_height') 
    weight = getattr(instance, '_weight') 
    notes = getattr(instance, '_notes') 
    if created: 
     Userprofile.objects.create(user=instance, 
            dateofbirth = dateofbirth, 
            gender = gender, 
            height = height, 
            weight = weight, 
            notes = notes) 

views.py

def signup(request): 
if request.method == "POST": 
    uform = UserForm(request.POST, instance=User()) 
    pform = UserprofileForm(request.POST, instance=Userprofile()) 

    if uform.is_valid() and pform.is_valid(): 
     email = BaseUserManager.normalize_email(uform.cleaned_data['email']) 
     djangouser = User.objects.create_user(uform.cleaned_data['username'], 
               email, 
               uform.cleaned_data['password']) 
     djangouser.last_name = uform.cleaned_data['last_name'] 
     djangouser.first_name = uform.cleaned_data['first_name'] 
     djangouser._dateofbirth = pform.cleaned_data['dateofbirth'] 
     djangouser._gender = pform.cleaned_data['gender'] 
     djangouser._height = pform.cleaned_data['height'] 
     djangouser._weight = pform.cleaned_data['weight'] 

     if pform.cleaned_data['notes']: 
      djangouser._notes = pform.cleaned_data['notes'] 
     else: 
      djangouser._notes = '' 
     djangouser.save() 
     return HttpResponseRedirect('..') 

是因爲我已經在models.py中定義了信號處理程序?我做錯了什麼,即使當我嘗試使用我在網上找到的完全相同的方法時,這種方法也無法正常工作?

回答

0

User.objects.create_user調用save直接,前輪廓屬性已被添加到實例。

不要這樣做。在用戶旁邊的視圖中創建配置文件。

+0

所以你的意思是說,我的實現實際上觸發信號的兩倍,但因爲它觸發第一次,實例仍然不具備必要的屬性失敗? –

+0

是的,這是正確的。 –

+0

謝謝!我添加了剛剛將「如果創建:」更改爲「如果未創建」,以確保它跳過嘗試在第一次運行中創建Userprofile。不能相信我在這麼簡單的事情上浪費了太多時間。 –