如何在Django中创建自定义mixin?

Nil*_*Kar 3 python django

我有一个decorater,如果id = 1的产品未激活,它可以防止用户访问url。我想创建与此类似的mixin。

这是我的设计师:

from django.core.exceptions import PermissionDenied
from ecommerce_integration.models import Product 



def product_1_activation(function):
    def wrap(request, *args, **kwargs):
        products = Product.objects.filter(pk=1, activate=True)
        if products:
            return function(request, *args, **kwargs)
        else:
            raise PermissionDenied
    wrap.__doc__ = function.__doc__
    wrap.__name__ = function.__name__
    return wrap
Run Code Online (Sandbox Code Playgroud)

任何想法如何创建类似于上述decorater的自定义混合。

实际上,我想为基于类的视图创建mixin。

有人可以帮我吗?

谢谢

Wil*_*sem 5

我们可以制作一个Mixin仅覆盖dispatch方法的,例如:

class ProductExistsRequiredMixin:

    def dispatch(self, request, *args, **kwargs):
        if Product.objects.filter(pk=1, activate=True):
            return super().dispatch(request, *args, **kwargs)
        else:
            raise PermissionDenied
Run Code Online (Sandbox Code Playgroud)

然后在如下视图中使用它:

class MyCustomView(ProductExistsRequiredMixin, View):

    # ...
Run Code Online (Sandbox Code Playgroud)

  • @logicOnAbstractions:MRO 中的下一项。因此,如果我们在`MyCustomView`中继承自`ProductExistsRequiredMixin`和`View`,那么这将是`View`的`dispatch`。但是,如果我们继承另一种覆盖“dispatch”的视图,那么这将是 MRO 中的第一项。 (2认同)