删除Django中的对象

时间:2010-06-26 16:45:25

标签: django forms object django-views

在迷你博客应用中,我想创建一个删除功能,以便博客的所有者可以删除他的条目(只有他的条目)。 我想这样做的唯一方法是使用表单。 虽然我的删除代码似乎清晰正确,但它不起作用。 我的代码:

def delete_new(request,id):
   u = New.objects.get(pk=id).delete()
   if request.method == 'POST':
       form = DeleteNewForm(request.POST)    
       form.u.delete()             
       form.save()   
   return render_to_response('news/deleteNew.html', {
           'form': form,
           }, 
        context_instance=RequestContext(request)) 

并在模板中:

<a href='/news/delete_new/{{object.id}}/'> Delete</a> <br /> 

这是正确的做法吗?我的意思是,为此创建一个表单? 另外,获取与删除链接相关联的博客文章的唯一方法是将id作为参数。这样对吗?我的意思是,也许任何用户都可以在网址中键入另一个ID,并删除另一个条目(最终不是他的一个)

2 个答案:

答案 0 :(得分:28)

您需要使用表单,否则您很容易受CSRF attacks攻击。在检查请求是GET还是POST之前,您还要删除模型。

创建一个简单的ModelForm

from django import forms

from .models import New

class DeleteNewForm(forms.ModelForm):
    class Meta:
        model = New
        fields = []

在同一个Django应用中的views.py中:

from django.shortcuts import render, get_object_or_404

from .forms import DeleteNewForm
from .models import New

def delete_new(request, new_id):
    new_to_delete = get_object_or_404(New, id=new_id)
    #+some code to check if this object belongs to the logged in user

    if request.method == 'POST':
        form = DeleteNewForm(request.POST, instance=new_to_delete)

        if form.is_valid(): # checks CSRF
            new_to_delete.delete()
            return HttpResponseRedirect("/") # wherever to go after deleting

    else:
        form = DeleteNewForm(instance=new_to_delete)

    template_vars = {'form': form}
    return render(request, 'news/deleteNew.html', template_vars)

答案 1 :(得分:20)

通常,对于删除对象,您应该使用POST(或DELETE)HTTP methods

如果你真的想在你的例子中使用HTTP GET,那么你需要解决这个问题:

如果你有url指向你的某个网址:<a href='/news/delete_new/{{object.id}}/'> Delete</a>那么你可以简单地编写一个视图,检查对象是否属于登录用户,如果是,则删除此条目,就像你已编写的代码一样:

def delete_new(request,id):
   #+some code to check if New belongs to logged in user
   u = New.objects.get(pk=id).delete()

要检查新对象是否与某些用户相关,您需要在UserNew之间创建相关内容(如created_by = models.ForeignKey(User)模型中的New)。

您可以通过以下方式登录用户:request.user

我希望我能正确理解你的观点,我的答案会以某种方式帮助你。

PS:您还可以考虑使用{% url %}标记,而不是直接在模板中编写网址。