当前位置:  开发笔记 > 编程语言 > 正文

删除Django中的对象

如何解决《删除Django中的对象》经验,为你挑选了2个好方法。

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

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)) 

并在模板中:

 Delete 

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



1> Wilfred Hugh..:

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

创建一个简单的ModelForm:

from django import forms

from .models import New

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

在您的views.py中,在相同的Django应用程序中:

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)


解释为什么这是最好的:在任何情况下,提交,更新和删除必须使用POST(或PUT)请求.GET请求可以在其他看起来不具有攻击性的链接中被屏蔽.比方说,如果一个主要网站在example.com/account/delete/上有一个简单的"删除所有我的东西",我可以在博客文章或类似TinyURL的服务中隐藏这样的链接.访问后,您会看到一个很好的"您的个人资料已被删除".页.混合方法,如Wilfred Hughes',在GET上显示一个确认页面,其中包含一个带有CSRF令牌的表单.POST请求验证CSRF,然后最终删除所请求的资源.

2> dzida..:

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

如果您真的想在您的示例中使用HTTP GET,那么您需要修复以下内容:

如果你有url指向你的某个url: Delete那么你可以简单地编写一个视图,检查对象是否属于登录用户,如果是,则删除此条目,就像你已编写的代码一样:

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

要检查新对象是否属于某些用户,您需要在User和之间创建realation New(如created_by = models.ForeignKey(User)New模型中).

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

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

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


我强烈建议使用表单并检查POST,因为页面的GET不应该改变服务器上的状态.(虽然,实际上这里发生的事情相对'安全')
这样做可以将您的网站打开到CSRF,因为没有传输/需要令牌.
这不是*安全的并且启用CSRF攻击,其中用户删除属于其他用户的内容.
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有