2013-10-15 39 views
4

我在/ notes/get/1 /中,其中id = 1,並且我在note.html中創建了一個「Delete Note」鏈接。我需要它從數據庫和應用程序中刪除當前的註釋並重定向到/ notes/all。你可以幫我用def delete中的代碼嗎?Python Django刪除當前對象

models.py:

class Note(models.Model): 
    title = models.CharField(max_length=200) 
    body = models.TextField() 
    cr_date = models.DateTimeField(auto_now_add=True) 

urls.py:

urlpatterns = patterns('', 

    url(r'^all/$', 'note.views.notes'), 
    url(r'^get/(?P<note_id>\d+)/$', 'note.views.note'), # 
    url(r'^language/(?P<language>[a-z\-]+)/$', 'note.views.language'), # 
    url(r'^create/$', 'note.views.create'), 
    url(r'^delete/$', 'note.views.delete'), <-------------------------- 
    url(r'^search/$', 'note.views.search_titles'), 
) 

views.py:

def delete(??????): 
    ????? <------------------------------------------- 
    return HttpResponseRedirect('/notes/all') 

回答

9
from django.shortcuts import get_object_or_404 
from django.core.urlresolvers import reverse 


def delete(request, id): 
    note = get_object_or_404(Note, pk=id).delete() 
    return HttpResponseRedirect(reverse('notes.views.notes')) 

而且在urls.py

url(r'^delete/(?P<id>\d+)/$','project.app.views.delete'), 

請確保在刪除對象之前檢查用戶權限,可以使用@permission_required修飾符https://docs.djangoproject.com/en/1.5/topics/auth/default/#the-permission-required-decorator。如果您沒有檢查,用戶可以輕鬆刪除所有筆記。

通常,使用POST或DELETE請求而不是GET來從數據庫中刪除對象是一個好主意。想象一下,google-bot抓取您的網站並訪問notes/delete/2。

+0

我會建議,'get_object_or_404(注意,PK = ID)'的',而不是獲得( )' – karthikr

+0

@karthikr你是對的 – fasouto

+0

它的意義非常大,但是URL頁面沒有找到(404) 請求方法:\t GET 請求URL:\t http://127.0.0.1:8000/ notes/delete/ –

2

你必須把一個變量插入網址:

url(r'^delete/(?P<id>\d+)/$', 'note.views.delete') 

然後查看功能應該是這樣的:

def delete(request, id): 
    obj = Note.objects.get(pk=id) 
    obj.delete() 
    return HttpResponseRedirect('/notes/all') 
+0

它使這麼多的培訓就業處,但也有一些是錯誤的URL頁面沒有找到(404) 請求方法:\t GET 請求URL:\t http://127.0.0.1:8000/notes/delete/ –

2

這是一個有點微的優化,但已經給出的答案會採取兩個數據庫調用,而你可以在一個:

Note.objects.filter(pk=id).delete() 
+0

請指正如果我錯了。但Django中的查詢集是懶惰的,所以如果我得到一個對象並在以後刪除它,只有刪除將會觸及數據庫。 – fasouto

+0

不,這沒有任何意義。 'get()'是一個總是碰到數據庫的操作(如'SELECT ... WHERE ...')。 delete()是第二個操作,它也會觸發數據庫。但是'filter(...)。delete()'轉化爲一個'DELETE'。 –

+0

我剛剛測試過,你說得對,謝謝! – fasouto

0

我認爲下面的代碼將解決prob LEM

Urls.py

url(r'^delete/(?P<id>\d+)/$','project.app.views.delete'), 

Views.py

from django.shortcuts import get_object_or_404 
from django.http import HttpResponseRedirect 

def delete(request, id): 
    note = get_object_or_404(Note, pk=id).delete() 
    return HttpResponseRedirect('/notes/all') 
+0

你確定這是嗎?例外值:\t 「^ delete /(?P \ d +)/ $」不是一個有效的正則表達式:未知的說明符:?P \ d –

6

你不需要因爲Django帶有這些手工編寫這些意見,他們被稱爲generic views

例如,貢獻刪除視圖執行以下操作:

  1. 要求用戶確認他們真的要刪除的對象。
  2. 刪除對象。
  3. 重定向到視圖。

這裏是你將如何使用它:

在你views.py

from django.views.generic.edit import DeleteView # this is the generic view 
from django.core.urlresolvers import reverse_lazy 
from yourapp.models import Note 

class NoteDelete(DeleteView): 
    model = Note 
    success_url = reverse_lazy('all_notes') # This is where this view will 
              # redirect the user 
    template_name = 'delete_note.html' 

創建delete_note.html模板,它只有這個:

Hey, are you sure you want to delete {{ object.title }}? 
<form method="post"> 
    {% csrf_token %} 
    <button type="submit" class="btn btn-danger">Yeap, I'm sure.</button> 
</form> 

在你urls.py

urlpatterns = patterns('', 

    url(r'^all/$', 'note.views.notes', name='all_notes'), # Giving your urls a name 
                 # makes it easier to refer 
                 # to them later 
    url(r'^get/(?P<note_id>\d+)/$', 'note.views.note'), # 
    url(r'^language/(?P<language>[a-z\-]+)/$', 'note.views.language'), # 
    url(r'^create/$', 'note.views.create'), 
    url(r'^delete/(?P<pk>\d+)/$', 'note.views.NoteDelete.as_view()', name="delete_note"), 
    url(r'^search/$', 'note.views.search_titles'), 
) 

現在,假設你要顯示的鏈接刪除一張紙條,說你index.html

Here are all my notes: 
<ul> 
{% for note in all_notes %} 
    <li>{{ note.title }} - <a href="{% url 'delete_note' pk=note.pk %}">Delete</a></li> 
{% endfor %} 
</ul> 
+0

我正在爲教育做這個工作,所以我需要了解一些pricipals,但我真的對你所說的Ask Box感興趣。我會爲此做最後的解決。謝謝,我會盡快回復您。 –