为什么Django Admin使用commit = False调用UserCreationForm保存方法?

时间:2018-04-13 19:00:20

标签: django django-admin

django管理员在哪里实际保存了它的模型?

我想打印一些仅在保存发生后创建的模型字段,但UserCreationForm保存方法始终使用commit = False调用,并且似乎返回用户,因此保存发生在其他地方。

class MyUserCreationForm(UserCreationForm):
    ...
    def save(self, commit=True):
        # django admin calling this with commit=False... save occurs somewhere else.
        ...
        if commit:
            print("this never gets printed")
            user.save()

        # line below prints nothing
        print(user.field_set_after_model_is_saved)

        return user

p.s:我的模型正常保存,而不是我预期的位置。

1 个答案:

答案 0 :(得分:0)

  

这个save()方法接受一个可选的commit keyword参数   接受True或False。如果使用commit = False调用save(),   然后它将返回一个尚未保存到的对象   数据库。在这种情况下,您可以在结果上调用save()   模型实例。如果要进行自定义处理,这非常有用   保存之前的对象,或者如果要使用其中一个   专业的模型保存选项。默认情况下,commit为True。

来自docs

当您使用commit=False时,您还没有保存在数据库中,它可以让您在保存之前管理对象。

例如:

class UserForm(forms.ModelForm):
    ...
    def save(self):
        # Sets username to email before saving
        user = super(UserForm, self).save(commit=False)
        user.username = user.email
        user.save()
        return user

如果先保存,请不要使用commit=False,它会保存两次,代表更多的数据库操作。 在你的情况下,我认为你可以使用post_save信号,看看here