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

时间:2016-02-04 04:30:28

标签: django django-views django-generic-views

我想从另一个视图返回带有参数的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并返回错误:
必须使用对象pk或slug

调用通用删除视图

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

我绝望甚至强硬我知道一些解决方法,这听起来应该是可能的,并且看起来很优雅。

感谢任何建议

2 个答案:

答案 0 :(得分:0)

来自docs

您应该使用reverse() urlresolver。

试试这个:

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})

答案 1 :(得分:0)

  

我不会按照您的方法从视图中调用另一个视图。 (我觉得这不是优雅的解决方案)

     

我没有测试过这个答案,因此您可能需要稍后调试一些小错误。

由于您的DeleteView可能使用不同的Model,因此您可能需要动态确定Model

您仍然可以使用通用DeleteView。由于它使用SingleObjectMixin,而不是在视图中指定model,因此您应该覆盖get_queryset方法或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()