2013-10-15 38 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感兴趣。我会为此做最后的解决。谢谢,我会尽快回复您。 –