Django - 如何使用视图删除对象
Posted
技术标签:
【中文标题】Django - 如何使用视图删除对象【英文标题】:Django - how to delete an object using a view 【发布时间】:2013-11-14 06:25:33 【问题描述】:我有 People 类
class People (models.Model):
first_name = models.CharField(max_length = 50)
last_name = models.CharField(max_length = 50)
email = models.EmailField(blank = True)
grade = models.CharField(max_length = 2)
def __unicode__(self):
return '%s %s' % (self.first_name, self.last_name)
我有删除视图
def delete(request):
query = People.objects.get(pk=id)
query.delete()
return HttpResponse("Deleted!")
我有html模板代码
% for person in people_list %
<TR ALIGN="CENTER">
<td> person.first_name </td>
<td> person.last_name </td>
<td> person.email </td>
<td> person.grade </td>
<td><form action="/modify.html">
<input type="submit" value="Modify">
</form></td>
<td><form action="/delete.html">
<input type="submit" value="Delete">
</form></td>
</TR>
% endfor %
如何从模板中获取person.id,放到delete视图中,删除我想要的person.id对应的对象。
【问题讨论】:
【参考方案1】:您需要让您的 delete
函数(顺便说一句,将其命名为其他名称,例如 delete_person
)接受一个参数 pk。
def delete_person(request, pk):
...
...
然后在你的 urlconf 中,做这样的事情
url(r'^delete_person/(?P<pk>\d+)/$', 'delete_person', name='delete_person')
然后像这样在模板中生成url
% url 'delete-person' person.id %
PS - 你的网址不需要以.html
结尾
PPS - 在视图中进行一些验证以确保用户有权删除此人是个好主意。
【讨论】:
你是我的男人!我们的答案有所不同,但方式几乎相同。 :)【参考方案2】:我认为您可以使用链接而不是表单:
替换此行
<td>
<form action="/delete.html">
<input type="submit" value="Delete">
</form>
</td>
有了这个
<td><a href="/delete/ person.id ">Delete</a></td>
在 urls.py 中,您应该添加以下行以将您的视图与 url 关联起来:
url(r'^delete/(?P<person_pk>.*)$', 'person.views.delete' name='delete-person'),
然后改变你的看法:
def delete(request, person_pk):
query = People.objects.get(pk=person_pk)
query.delete()
return HttpResponse("Deleted!")
【讨论】:
这是一个非常糟糕的主意。不应使用 GET 调用修改数据库的操作。 我只想做一个简单的项目应用 @DanielRoseman 我不这么认为,如果您在视图中进行必要的控制,无论是获取、发布、删除还是其他方式都没有关系。由于我可以模拟所有类型的请求,因此所有 http 请求都处于同一级别。 @DanielRoseman 除非正在使用csrf_middleware
,否则使用POST
或GET
不一样吗?虽然是的,但我同意应该使用 POST
或 ajax PUT
或 DELETE
请求来修改数据库对象。【参考方案3】:
为了扩展 @scriptmonster,我尝试将查询包装起来,但要正确返回 404
# urls.py
path("foo/<int:pk>/", views.ModelView.as_view(), name="foo-detail"),$
和
# views.py
from django.http import HttpResponse, HttpResponseNotFound
class ModelView(View):
model = Foo
def delete(self, request, *args, **kwargs):
foo_id = kwargs["pk"]
try:
query = Foo.objects.get(pk=foo_id)
query.delete()
return HttpResponse("Deleted!")
except:
return HttpResponseNotFound()
【讨论】:
【参考方案4】:from test_app.(your Application Name) import views
path('delete/(?p<id>\d+)/',views.delete_View(),
【讨论】:
虽然这段代码可以解决问题,但如果解释一下它的作用方式/原因,答案会好得多。请记住,您的答案不仅适用于提出问题的用户,还适用于所有其他找到该问题的人。【参考方案5】:通过基于类的视图删除对象:
views.py
from django.views import generic
from django.urls import reverse_lazy
class PeopleDeleteView(generic.edit.DeleteView):
model = People
success_url = reverse_lazy('people_list')
urls.py
...
path('delete/<int:pk>/', views.PeopleDeleteView.as_view(), name='delete'),
您需要一个删除确认模板:
myapp/people_confirmation_delete.html
<form method="post">% csrf_token %
<p>Are you sure you want to delete " object "?</p>
<input type="submit" value="Confirm">
</form>
【讨论】:
以上是关于Django - 如何使用视图删除对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用显示多个对象项的视图并在从 Django 数据库中删除其中一项后显示 html?
Django:如何在删除视图中使用 request.POST