【问题标题】:Deleting an object field before saving using django forms在使用 django 表单保存之前删除对象字段
【发布时间】:2011-05-23 15:23:08
【问题描述】:

以下代码使用表单来保存新的用户头像图片,但是我无法删除删除旧头像并使用新头像进行更新。我尝试了许多不同的代码变体。

谁能指出我正确的方向。关于为什么会发生这种情况的解释和简短的例子将非常有帮助。非常感谢所有帮助。

型号

class Profile(models.Model):
user = models.ForeignKey('auth.User')
avatar = Image..................

查看

@login_required
def profile(request, pk):
    profile = Profile.objects.get(user=pk)
    pf = ProfileForm(request.POST, request.FILES, instance=profile)
    if request.method =="POST":
        if pf.is_valid():
            profile.avatar.delete() #doesn't work
            pf.save()

    return render_to_response('template.html', {
        'profile': profile,
        'pf':pf
    }, context_instance=RequestContext(request))

模板

<form enctype="multipart/form-data" action="" method="POST"> {% csrf_token %}
    {{ pf }}
    <input type="submit" value="Submit" id="submit" />
</form>

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    关系的作用类似于objects 属性。 MyModel.objects.delete() 也不起作用。你需要做类似profile.avatar.all().delete()

    更新:以上适用于多对多关系。 delete() 可以直接通过外键访问。

    但是,当删除外键时,Django 会删除关联的数据库行并取消外键的 pk/id 属性,但它确实不会清除外键的数据立即地。从技术上讲,您可以执行以下操作:

    profile.avatar.delete()
    profile.avatar.save()
    

    而且,您最终会得到相同的对象,只是主键不同。

    【讨论】:

    • 对不起,我是 Django 新手。您能否进一步解释一下以帮助我理解。你是什​​么意思?当然,所需的图像已使用“profile = Profile.objects.get(user=pk)”和 profile.avatar 行找到。使用您的建议,我似乎没有得到所有属性。
    • 我还收到以下信息:可通过配置文件实例访问的管理器 inst。我可以先保存然后删除,但是这样会更难找到正确的图像?
    • 抱歉,由于delete 不起作用,我认为您实际上是在处理多对多关系。如果avatar 只是一个外键,那么delete 应该可以工作。但是,重要的是要意识到profile.avatar 将在请求的整个生命周期内保留其数据(由于查询缓存),但如果您测试profile.avatar.pk,它应该为空,表明它实际上不再存在。
    • 快到了,非常感谢您的帮助。非常感激。最后,我被要求再提供两个论点,因为只给出了一个。所以它删除了 pk,用户是 FK 和关联的头像但是我只想删除/保存当前/新头像而不接触用户或 PK。这可能吗?
    • 如果您只是修改头像,您可以执行profile.avatar.save(),但如果您实际替换头像,您必须执行profile.save() 才能提交更改。可以将其视为拥有被修改属性的任何对象都必须保存。
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多