在Django中删除多个对象

191
我需要在Django中使用网页选择要从数据库中删除的多个对象。没有可供选择的类别,所以我不能像那样从所有类别中删除。我是否需要实现自己的删除表单并在Django中处理它,还是Django已经有一种方法可以做到这一点?就像在管理界面中实现的那样。
具体来说,我需要使用网页上的表单选择要删除的对象。然后在我的views.py中处理从表单返回的数据。然后循环遍历从表单返回的数据,并在循环过程中删除数据。但我想知道在Django中实现这个的最佳做法是什么。
2个回答

363
你可以删除任何你想删除的QuerySet。例如,要删除某个名为Post的模型中的所有博客文章。
Post.objects.all().delete()

并删除任何具有未来发布日期的帖子。

Post.objects.filter(pub_date__gt=datetime.now()).delete()

然而,您需要想出一种缩小QuerySet的方法。如果您只想要一个视图来删除特定的对象,请查看删除通用视图

编辑:

抱歉造成了误解。我认为答案介于两者之间。要实现自己的功能,请结合使用ModelForm通用视图。否则,请查看提供类似功能的第三方应用程序。在相关问题中,建议使用django-filter


1
不好意思,你误解了问题。我知道我可以删除所有东西。但是我需要使用网页上的表单选择要删除的对象。然后在我的views.py中处理从表单返回的数据。然后循环遍历返回的表单数据并在循环过程中进行删除。但是我想知道在Django中实现这个的最佳实践是什么。 - Dean
啊,我的错误!我要么使用第三方应用程序,要么使用带有“ModelForm”的通用视图。 - Matt Luongo
8
@Dean,请查看删除视图。或者你也可以自己编写一个视图... 我的意思是,最终你可能会收到一组主键列表并调用模型上的删除操作... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete(),我确定你想要一些东西来确保随机人员不能通过猜测主键来删除数据库中的所有对象。 - Yuji 'Tomita' Tomita
@YujiTomita,你能否写出更详细的答案来回应你的评论?因为那正好是能够回答我的问题的类型。 - Dean
1
@Dean,如果不了解更多信息,很难回答你的问题。你只需要构建一个表单,允许用户选择正确的删除条件(无论是什么 - 也许甚至是一个输入框,其中输入ID号码...但可能更复杂),构建一个响应该表单的视图,可能执行验证(权限),最后运行filter(foo).delete()方法。 - Yuji 'Tomita' Tomita
1
这个框架没有包含这个功能的原因之一是涉及到编辑/删除授权和其他复杂性问题,正如@YujiTomita所提到的。如果您确实需要复杂的过滤功能,请查看django-filtering,并添加一个删除按钮,如果用户被授权,则调用QuerySet.delete()。 - Matt Luongo

0
我需要在网页上使用表单来选择要删除的对象。
由于每个对象都有一个唯一的id,选择要删除的项目的一种方法是使用id。
以下是一个示例,网页上的一个按钮将对象的id传递给view.py文件中的POST请求进行处理。

views.py

from django.shortcuts import render
from .models import MyModel

def myview(request):
    # initialize some data to delete
    if request.method == 'GET': MyModel(name='John Doe', score=83).save()

    # delete object with the id that was passed in the post request
    if request.method == 'POST':
        if 'delete' in request.POST:
            try:
                # id of the object to delete
                key = request.POST['delete']
                # delete that object
                MyModel.objects.get(id=key).delete()
            except MyModel.DoesNotExist:
                pass
    scores = MyModel.objects.all()
    return render(request, 'mypage.html', {'scores': scores})

models.py

from django.db import models
class MyModel(models.Model):
    name = models.CharField(max_length=50)
    score = models.IntegerField()

urls.py

from django.urls import path
from .views import myview

urlpatterns = [
    path('mypage/', myview, name='mypage')
]

templates/mypage.html

<form method='post' action={% url 'mypage' %}>
    {% csrf_token %}
    {% for person in scores %}
        {{ person.name }} {{ person.score }}
        {% comment %} to differentiate entries, use id {% endcomment %}
        <button name='delete', value="{{person.id}}">Delete</button><br>
    {% endfor %}
</form>

它创建了一个网页,看起来像下面这样,当点击删除按钮时,"John Doe"的条目将被删除。

ex


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接