4

案例我在 /notes/get/1/ 中,其中 id=1 并且我在 note.html 中创建了一个“删除笔记”链接。我需要它从数据库和应用程序中删除当前笔记并重定向到 /notes/all。你能帮我解决def delete中的代码吗?

模型.py:

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

网址.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'),
 )

视图.py:

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

5 回答 5

10
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。

于 2013-10-15T13:39:58.650 回答
6
于 2013-10-15T14:48:29.493 回答
2

这是一种微优化,但已经给出的答案将需要两次数据库调用,而您可以一次完成:

Note.objects.filter(pk=id).delete()
于 2013-10-15T13:52:01.733 回答
2

您必须将变量放入 url:

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')
于 2013-10-15T13:41:01.247 回答
0

我认为下面的代码将解决问题

网址.py

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

视图.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')
于 2013-10-15T14:28:16.727 回答