save() 方法的返回类型

Posted

技术标签:

【中文标题】save() 方法的返回类型【英文标题】:Return type of the save() method 【发布时间】:2018-11-17 15:36:06 【问题描述】:

我是一个尝试使用 django 创建注册表单的初学者。这是我之前写的寄存器视图类。

def register(request):

registered= False

if request.method=="POST":
    user_form= UserRegistrationForm(data=request.POST)
    profile_form= UserProfileInfoForm(data=request.POST)

    if user_form.is_valid() and profile_form.is_valid():
        user_form.save()
        user_form.set_password(user_form.password)
        user_form.save()

        profile_form.save(commit=False)
        profile_form.user=user_form

        if 'profile_pic' in request.FILES:
            profile_form.profile_pic=request.FILES('profile_pic')


        profile_form.save()

        registered=True

    else:
        print(user_form.errors,profile_form.errors)

else:
    user_form=UserRegistrationForm()
    profile_form=UserProfileInfoForm()


return render(request,'basic_app/register.html',
              'user_form':user_form,
               'profile_form':profile_form,
               'registered':registered)

代码给出了我的 user_form 对象没有 set_password() 方法的错误。 然后我通过将“user_form”保存到另一个名为“user”的实例中来更改我的代码。这是我的新代码。我添加了一个额外的打印功能来检查这两个对象的类型。

def register(request):

registered=False

if request.method=="POST":
    user_form=UserForm(data=request.POST)
    profile_form=UserProfileInfoForm(data=request.POST)

    if user_form.is_valid() and profile_form.is_valid():

        user=user_form.save()
        print(type(user_form),"   ",type(user))
        user.set_password(user.password)
        user.save()

        profile=profile_form.save(commit=False)
        profile.user=user

        if 'profile_pic' in request.FILES:
            profile.profile_pic=request.FILES['profile_pic']

        profile.save()

        registered=True

    else:
        print(user_form.errors,profile_form.errors)


else:
    user_form=UserForm()
    profile_form=UserProfileInfoForm()


return render(request,'basic_app/register.html',
              'user_form':user_form,
               'profile_form':profile_form,
               'registered':registered)

打印语句的输出给出了这个

<class 'basic_app.forms.UserRegistrationForm'>     <class 'django.contrib.auth.models.User'>

我不明白当它们都是相同形式的实例时,它们的类型为什么会不同。还有为什么当第二个代码起作用时,第一个代码不起作用。

这是我关于 SO 的第一个问题。谢谢。

【问题讨论】:

“我不明白当它们都是相同形式的实例时,它们的类型怎么会不同。” user_formUserRegistrationForm 的实例。然而,如果您执行user = user_form.save(),则user 变量将被分配save() 方法返回的值,这恰好是User 模型的一个实例。 谢谢,现在更清楚了。 【参考方案1】:

ModelForm.save() 不返回ModelForm 的实例。它返回由ModelForm 创建/更新的Model 实例。

【讨论】:

谢谢,我明白了。

以上是关于save() 方法的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP add save delete的返回说明

save方法返回值为联合主键的id时候怎么转换为string类型

为啥 django ORM 的`save` 方法不返回保存的对象?

Django:在模型 save() 方法中返回序列化程序 ValidationError

当监视调用 save 方法的 JPARepository 时返回 null

Kohana 3.2 - ORM 的 pk() 方法在 save() (create()) 之后返回 false - 为啥?