Python Django删除当前对象

2024-04-28 04:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在/notes/get/1/where id=1中,我在Note.html中创建了一个“Delete Note”链接。我需要它从数据库和应用程序中删除当前注释,并重定向到/notes/all。你能帮我删除def中的代码吗?

型号.py:

class Note(models.Model): 
   title = models.CharField(max_length=200)
   body = models.TextField()
   cr_date = models.DateTimeField(auto_now_add=True)

网址.py:

urlpatterns = patterns('',

  url(r'^all/$', 'note.views.notes'), 
  url(r'^get/(?P<note_id>\d+)/$', 'note.views.note'), #
  url(r'^language/(?P<language>[a-z\-]+)/$', 'note.views.language'), # 
  url(r'^create/$', 'note.views.create'),
  url(r'^delete/$', 'note.views.delete'), <--------------------------
  url(r'^search/$', 'note.views.search_titles'),
 )

视图.py:

def delete(??????):
    ?????  <-------------------------------------------
    return HttpResponseRedirect('/notes/all')

Tags: pyidurlsearchgetmodelsdefcreate
3条回答
from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse


def delete(request, id):
    note = get_object_or_404(Note, pk=id).delete()
    return HttpResponseRedirect(reverse('notes.views.notes'))

urls.py

url(r'^delete/(?P<id>\d+)/$','project.app.views.delete'),

确保在删除对象之前检查了用户权限,您可以使用@permission\u required decoratorhttps://docs.djangoproject.com/en/1.5/topics/auth/default/#the-permission-required-decorator。如果不检查,用户可以轻松删除所有笔记。

通常,使用POST或DELETE请求而不是GET从数据库中删除对象是一个好主意。想象一下google bot抓取你的站点并访问notes/delete/2。

必须将变量放入url:

url(r'^delete/(?P<id>\d+)/$', 'note.views.delete')

那么视图函数应该是这样的:

def delete(request, id):
    obj = Note.objects.get(pk=id)
    obj.delete()
    return HttpResponseRedirect('/notes/all')

您不需要手工编写这些视图,因为django附带了这些视图,它们被称为generic views

例如,贡献的删除视图执行以下操作:

  1. 要求用户确认是否确实要删除对象。
  2. 删除对象。
  3. 重定向到视图。

以下是您将如何使用它:

在您的views.py中:

from django.views.generic.edit import DeleteView # this is the generic view
from django.core.urlresolvers import reverse_lazy
from yourapp.models import Note

class NoteDelete(DeleteView):
    model = Note
    success_url = reverse_lazy('all_notes') # This is where this view will
                                            # redirect the user
    template_name = 'delete_note.html'

创建delete_note.html模板,该模板只有以下内容:

Hey, are you sure you want to delete {{ object.title }}?
<form method="post">
  {% csrf_token %}
  <button type="submit" class="btn btn-danger">Yeap, I'm sure.</button>
</form>

在您的urls.py中:

urlpatterns = patterns('',

  url(r'^all/$', 'note.views.notes', name='all_notes'), # Giving your urls a name
                                                        # makes it easier to refer
                                                        # to them later
  url(r'^get/(?P<note_id>\d+)/$', 'note.views.note'), #
  url(r'^language/(?P<language>[a-z\-]+)/$', 'note.views.language'), # 
  url(r'^create/$', 'note.views.create'),
  url(r'^delete/(?P<pk>\d+)/$', 'note.views.NoteDelete.as_view()', name="delete_note"),
  url(r'^search/$', 'note.views.search_titles'),
 )

现在,假设您想要显示一个链接来删除一个注释,比如在您的index.html

Here are all my notes:
<ul>
{% for note in all_notes %}
   <li>{{ note.title }} - <a href="{% url 'delete_note' pk=note.pk %}">Delete</a></li>
{% endfor %}
</ul>

相关问题 更多 >