2011-05-23 55 views
1

下面的代碼使用表單來保存一個新的用戶頭像圖片,但是我無法得到這個刪除舊頭像並刪除舊的頭像。我已經嘗試了許多不同的代碼變體。在使用django表單保存前刪除一個對象字段

難道有人指出我正確的方向。爲什麼會發生這種情況的解釋和簡短的例子將是非常有幫助的。所有的幫助非常感謝。

模型

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> 

回答

1

關係法像objects屬性。 MyModel.objects.delete()也不會工作。您需要執行如下操作:profile.avatar.all().delete()

UPDATE:以上內容適用於多對多關係。 delete()可以直接從外鍵訪問。

當刪除一個外鍵,不過,Django的刪除相關的數據庫行並取消外鍵的pk/id屬性,但它不明確出來的數據立即外鍵。你可以在技術上做類似如下的事情:

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

而且,你最終會得到相同的對象,只能使用不同的主鍵。

+0

對不起,我是Django的新手。你可以請進一步解釋,以幫助我理解。你的意思是?當然,使用「profile = Profile.objects.get(user = pk)」和profile.avatar這一行來定位所需的圖像。我似乎沒有得到任何使用您的建議命名的屬性。 – Stu 2011-05-23 15:47:07

+0

我還收到以下內容:經由配置文件實例可訪問的管理員。我可以先保存然後刪除,但這會讓事情更難以找到正確的圖像? – Stu 2011-05-23 16:02:09

+0

對不起,我假設'delete'不起作用,你實際上正在處理多對多的關係。如果'avatar'只是一個外鍵,那麼'delete'應該可以工作。然而,認識到'profile.avatar'會在請求的整個過程中保留它的數據是非常重要的(由於查詢緩存),但是如果你測試'profile.avatar.pk',它應該是null,表明它不會'實際上已經存在了。 – 2011-05-23 16:10:46

相關問題