【问题标题】:Django form change instance attribute before savingDjango表单在保存之前更改实例属性
【发布时间】:2014-11-12 09:49:57
【问题描述】:

正如我在标题中所说:

def profile(request, template='/member/profile.html'):

    .....

    member = get_object_or_404(Member, id=id)

    # >>> member.qrcode
    #  <ImageFieldFile: upload/qrcode/2014-11-12/99_1.41578387725e12.jpg>


    if request.method == 'POST':
        form = ProfileForm(request.POST, request.FILES, instance=member)

        # >>> member.qrcode
        #  <ImageFieldFile: 20140901192104.png>

        if form.is_valid():
            member = form.save(commit=False)
.....

表单实例memberform = ProfileForm(request.POST, request.FILES, instance=member) 之后立即更改。
因为我只想在member.type == 1时保存成员,并根据比较memberform.cleaned_data中的一些数据的结果更改一些字段。

我认为在调用form.save()之前更改member的属性是非常糟糕的。
怎么改?

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    如果您在 commit=False 的情况下调用 save(),那么它将返回一个尚未保存到数据库的对象。

    https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

    member = form.save(commit=False)
    if member.type == 1:
        member.save()
    

    【讨论】:

    • 这种方法没有任何问题 - 它已记录在案。同样在某些情况下,您可以使用pre_save docs.djangoproject.com/en/dev/ref/signals/#pre-save 其中instance == form.save(commit=False)
    • 实例成员在form = ProfileForm(request.POST, request.FILES, instance=member) 之后立即更改,而不是member = form.save(commit=False) .member 在if form.is_valid(): 之前已更改。
    • 但是,实际上instance member 在我的机器win7 py2.7 django 1.6.7 上创建ProfileForm 对象后发生了变化。你能做一个测试吗?
    • 我没有win7,但目前使用相同的py2.7 django 1.6.7,没关系,我做了简单的测试-self.object的模型返回some_field,我'已更改表单中的此字段并将其发送到 updateview,其中 put 打印 print(self.object) form = self.form_class(request.POST, instance=self.object) print(self.object) 两个相同值的结果
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多