Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除视图扩展_Python_Django - Fatal编程技术网

Python 删除视图扩展

Python 删除视图扩展,python,django,Python,Django,我得到以下错误: class BaseDeleteViewMixin(): template_name = 'confirm_delete.html' def get_success_url(self): return reverse_lazy('index-' + self.model._meta.model_name) def post_override(self, view_class, request, *args, **kwargs):

我得到以下错误:

class BaseDeleteViewMixin():
    template_name = 'confirm_delete.html'

    def get_success_url(self):
        return reverse_lazy('index-' + self.model._meta.model_name)

    def post_override(self, view_class, request, *args, **kwargs):
        self.object = self.get_object()
        if "cancel" in request.POST:
            url = self.get_success_url()
            return HttpResponseRedirect(url)
        else:
            return super(view_class, self).post(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        klass = type(self)
        return self.post_override(klass, request, *args, **kwargs)


class PersonDeleteView(BaseDeleteViewMixin, DeleteView):
    model = Person
方法帖子,放置在PersonDeleteView中

Request Method: POST
Request URL:    http://192.168.33.10:8000/contractor/person/111/delete/
Django Version: 1.7.4
Exception Type: RuntimeError
Exception Value: maximum recursion depth exceeded while calling a Python object
Exception Location: /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py in __call__, line 59
很好。 如何正确覆盖BaseDeleteViewMixin中的post

我的目标是创建任何ModelNameDeleteView,而不覆盖其中的帖子。但是

我选择下一个解决方案:

 class PersonDeleteView(BaseDeleteViewMixin, DeleteView):
    model = Person
    def post(self, request, *args, **kwargs):
        klass = type(self)
        return self.post_override(klass, request, *args, **kwargs)
type(self)
将返回对象的实际类(
PersonDeleteView
),而不是该代码所在的类(
BaseDeleteViewMixin
),因此
super
将在
PersonDeleteView
的上下文中启动。这将导致从
BaseDeleteViewMixin
再次启动post方法,而不是从
DeleteView
启动(正如您所期望的那样)


只需在您的
super
调用中硬编码您的mixin类名。

您的问题是什么?
class BaseDeleteViewMixin():
    # other code
    def post_override(self, request, *args, **kwargs):
        self.object = self.get_object()
        if "cancel" in request.POST:
            url = self.get_success_url()
            return HttpResponseRedirect(url)
        else:
            return super(kwargs["view_class"], self).post(request)


class PersonDeleteView(BaseDeleteViewMixin, DeleteView):
    model = Person
    def post(self, request, *args, **kwargs):
        return self.post_override(request, view_class=PersonDeleteView)