' AttributeError的'试图在post_save'中尝试传递实例论证

时间:2016-11-15 18:15:04

标签: python django

我到处寻找解决方案,但建议的方法要么过时,要么根本不起作用。奇怪的是,我在Django文档中找不到明确的答案,因为这似乎是一种非常常见的情况。

我已将Django " User" 模型扩展为我自己的,名为" Userprofile ",使用一对一的关系。我希望在此模型中存储一些与用户相关的其他数据。我创建了一个" post_save "信号处理程序,用于创建Userprofile实例并在创建帐户期间插入使用的其他数据

我发现我应该可以使用"实例"变量与信号一起发送,但当我尝试访问它时,我只是出现错误表示

  

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中定义了信号处理程序吗?我做错了什么,即使我尝试使用我在网上找到的完全相同的方法,这也不会起作用?

1 个答案:

答案 0 :(得分:0)

在将个人资料属性添加到实例之前,

User.objects.create_user会直接调用save

不要这样做。在视图中与用户一起创建配置文件。