即使给出了参数,django中的扩展用户模型也不会在创建时设置字段

时间:2014-08-22 23:48:30

标签: python django django-models

当我使用我创建的注册表单创建新用户时,用户会成功创建用户,并且该扩展名明显具有指向用户的字段,但是当我在创建期间传递名称或生日等内容时处理它在扩展配置文件中显示为无

这是我的用户

的扩展名
class user(models.Model):
    account=models.OneToOneField(User)
    name=models.CharField(max_length=100)
    birthdate=models.DateField(default="1993-12-12")
    profilepicture=models.ManyToManyField('Photo',null=True, blank=True)  
    institute=models.CharField(max_length=100)  
    univeresitiesrated=models.ManyToManyField("university",null=True, blank=True)
    nationality=models.CharField(max_length=100)
    residence=models.CharField(max_length=100)
    aboutself=models.TextField(null=True, blank=True)

def create_user_callback(sender,instance,**kwargs):
    user1,new=user.objects.get_or_create(account=instance)
post_save.connect(create_user_callback,sender=User,weak=False)

和我的views.py

def UserRegistration(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile')
    if request.method=='POST':
            password=request.POST['password']
            newuser,created=User.objects.get_or_create(username=request.POST['username'],email=request.POST['email'])
            if created:
                newuser.set_password(password)
                newuser.save()
                userprofile=user(account=newuser,name=request.POST['name'],birthdate=request.POST['birthdate')

            return HttpResponseRedirect('/profile')

    else:
        c={}
        c.update(csrf(request))
        return render_to_response('register.html',c)

1 个答案:

答案 0 :(得分:0)

问题是你是在创建一个Python对象,而不是通过使用Django的objects.create()方法来实现它,该方法也将对象保存在数据库中。

如果要创建包含值的实例,请尝试以下操作:

# save the instance
user_saved = user.objects.create(account = newuser, name = request.POST['name'], birthdate = request.POST['birthdate')

# retrieve the instance
user_retrieved = user.objects.get(account = newuser.id)

如果您要检索现有实例并指定字段值,请尝试以下操作:

user_retrieved = user.objects.get(account = newuser.id)    
user_retrieved.name = "Raf"
user_retrieved.save()

objects.create()方法包含对save()的调用,这就是您不必在第一个示例中明确调用它的原因。如果您以其他方式创建对象,则必须自己调用save()方法。同样,如果检索现有实例并编辑某些字段,则必须调用save()将更改保存到数据库。有关保存Django模型对象的更多信息,请查看此处:https://docs.djangoproject.com/en/dev/ref/models/instances/#saving-objects


顺便说一句,Django User类已经有first_namelast_name个字段,您可以使用这些字段,而不是定义单独的name字段。

此外,Python中的约定是大写类名的第一个字母。函数通常使用小写名称。因此,最好将user类命名为ProfileStudentInfo,因为Django中已存在User