django - 在 Django 中删除对象

标签 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 作为参数。这样对吗?我的意思是,也许任何用户都可以在 url 中输入另一个 id,然后删除另一个条目(最终不是他的条目)

最佳答案

您需要使用表单,否则您很容易受到 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)

关于django - 在 Django 中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3124658/

相关文章:

python - Django - 使用外键获取对象

javascript - 使用 jquery 形成预填充(使其可扩展)

javascript - 如何使用对象的键调用函数..?

python - 如何指定 Django 表单中字段的顺序?

Django:将两个序列化器添加在一起?

python - 无法从登录页面进一步移动,[django-otp]

我自动将 Python 内容作为字段传递给类

jquery - 不是由 jquery 生成时的未知边距

javascript - 采用表单字段名称和值创建 JSON 架构

javascript - 如何将作为另一个对象的属性的函数传递给函数并在 javascript 中调用它?