我到处寻找解决方案,但建议的方法要么过时,要么根本不起作用。奇怪的是,我在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中定义了信号处理程序吗?我做错了什么,即使我尝试使用我在网上找到的完全相同的方法,这也不会起作用?
答案 0 :(得分:0)
User.objects.create_user
会直接调用save
。
不要这样做。在视图中与用户一起创建配置文件。