如何使用另一个视图的参数调用 GenericModelViews?

How to call GenericModelViews with arguments from another view?

我想 return GenericDeleteView 使用另一个视图的参数。

我有一个视图,它获取对象的 pk,我想使用 Django 通用 DeleteView 子类删除它。

问题是pk可以是不同型号

我定义了相应的 GenericDeleteViews,如果我将它们添加到 urls.py 并从那里使用位置参数触发它们,一切正常。但我想要一些不同的东西。

我想要的示例:

views.py

def delete_object_view(request, pk):
if FirstModel.objects.filter(pk=pk).exists():
    return FirstModelDeteleView.as_view()(request, !!pk!!)
else:
    return SecondModelDeleteView.as_view()(request, !!pk!!)

但情况是,这不会将 pk 传递给 DeleteView,它 return 是错误:
必须使用对象 pk 或 slug 调用通用删除视图

我尝试了很多替代方案,通过了 kwargs={'pk':pk} 和其他一些,但似乎没有任何效果。

我很绝望,甚至很艰难我知道一些解决方法,这听起来应该是可行的,而且看起来很优雅。

感谢任何建议

来自docs

您应该使用 reverse() 网址解析器。

试试这个:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

    if FirstModel.objects.filter(pk=pk).exists():
        return HttpResponseRedirect('first_model_delete',kwargs={'pk' : pk})
    else:
        return HttpResponseRedirect('second_model_delete',kwargs={'pk' : pk})

I will not follow your approach in calling another view from a view. (i find it is not elegant solution)

I have not test this answer, so you may need to debug some minor errors later.

因为您的DeleteView可能使用不同的Model,那么您可能需要动态确定Model

您仍然可以使用通用 DeleteView. Since it uses the SingleObjectMixin, instead of specifying the model in the View, you should then overwrite get_queryset method or get_object 方法。

示例代码:

class MyDeleteView(DeleteView):
    def get_queryset(self):
        if FirstModel.objects.filter(pk=<pk>).exists():
            return FirstModel.objects.all()
        else:
            return SecondModel.objects.all()