我有一个视图,它获取一个对象的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}
和其他一些,但似乎没有任何工作。
我绝望甚至强硬我知道一些解决方法,这听起来应该是可能的,并且看起来很优雅。
感谢任何建议。
答案 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()