我想为我的应用程序构建一个通用删除视图。基本上我想要与标准的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')
答案 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