我到處搜索一個解決方案,但建議的方法要麼過時,要麼根本不工作。很奇怪,我在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中定義了信號處理程序?我做錯了什麼,即使當我嘗試使用我在網上找到的完全相同的方法時,這種方法也無法正常工作?
所以你的意思是說,我的實現實際上觸發信號的兩倍,但因爲它觸發第一次,實例仍然不具備必要的屬性失敗? –
是的,這是正確的。 –
謝謝!我添加了剛剛將「如果創建:」更改爲「如果未創建」,以確保它跳過嘗試在第一次運行中創建Userprofile。不能相信我在這麼簡單的事情上浪費了太多時間。 –