首页 > 解决方案 > 如何在 django 的子类中使用与父类不同的装饰器?

问题描述

我有 2 个基于类的视图MyFirstViewMySecondView. 我希望这两个视图使用彼此不同的装饰器。我已经在谷歌上搜索了将近一个小时的解决方案,但仍然找不到任何答案。所以我在这里寻求帮助。

@method_decorator(my_first_decorator, name="dispatch")
class MyFirstView(UpdateView):
    # some attributes
    # some methods


@method_decorator(my_second_decorator, name="dispatch")
class MySecondView(MyFirstView):
    # some attributes

我一直在尝试为上面显示的视图提供不同的装饰器,但由于某种原因MySecondView仍在使用MyFirstView's 装饰器。

我也试图覆盖调度方法,但没有任何成功。

class MyFirstView(UpdateView):

    @method_decorator(my_first_decorator)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    # some attributes
    # some methods


class MySecondView(MyFirstView):

    @method_decorator(my_second_decorator)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    # some attributes

标签: pythondjango

解决方案


第二种方法似乎是正确的,但您必须跳过 MRO 中的一个父级:

class MySecondView(MyFirstView):

    @method_decorator(my_second_decorator)
    def dispatch(self, *args, **kwargs):
        return super(MyFirstView, self).dispatch(*args, **kwargs)

这样,super调用简单的未修饰的原始实现,而不是来自其直接超类的受污染的实现。


推荐阅读