django:泛型删除视图

时间:2014-08-07 06:10:18

标签: python django

我想为我的应用程序构建一个通用删除视图。基本上我想要与标准的django admin具有相同的行为。例如。我希望能够使用相同的视图(和模板)删除不同的对象。

我正在查看django文档,看起来DeleteViews与他们应该删除的模型相结合。例如。

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

我想创建更通用的东西,例如

class AnyDelete(DeleteView):
    model = I want to have a list of models here
    success_url = reverse_lazy('some-remaining-list')

1 个答案:

答案 0 :(得分:1)

发明CBV的原因是解决像你这样的问题。正如您已经写过的,要创建自己的删除视图,您只需要子类DeleteView并更改两个属性。我觉得很容易并且一直这样做(我唯一需要做的非干活就是将它挂钩到urls.py)。

在任何情况下,如果你真的想要创建更通用的东西(例如只删除每种模型的一个视图),那么你需要使用content types framework。正如您将在文档中看到的,内容类型框架可用于处理任意模型的对象。因此,在您的情况下,您可以创建一个简单的视图,它将获得三个参数:app_label,model和要删除的模型的pk。然后你可以像这样实现它:

from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404

def generic_delete_view(request, app_label, pk):
  if request.method == 'POST':
    my_type = ContentType.objects.get(app_label=app_label, model=model)
    get_object_or_404(my_type.model_class(), pk=pk).delete()

    # here you must determine *where* to return to
    # probably by adding a class method to your Models 

当然在您的urls.py中,您必须挂钩此视图,以便它接收三个参数(然后像/ this / generic_delete / application / Model / 3一样调用它)。这是一个如何将它挂钩到urls.py中的示例:

urlpatterns = patterns('',
  # ....
  url(
    r'^generic_delete/(?P<app_label>\w+)/(?P<model>\w+)/(?P<pk>\d+)$',
    views.generic_delete_view,  
    name='generic_delete' 
  ) ,
  # ...
)

如果您有一个对象列表,并希望获取每个对象的app_label和模型以构建泛型删除网址,您可以执行以下操作:

from django.core.urlresolvers import reverse

object = # ... 
ct = ContentType.objects.get_for_model(object)
generic_delete_url = reverse('generic_delete', kwargs = {
  app_label=ct.app_label,
  model=ct.model,
  pk=object.pk
})
# so generic_delete_url now will be something like /my_app/MyModel/42