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

时间:2019-02-08 12:01:35

标签: python django

我有一个修饰器,如果id = 1的产品未激活,则阻止用户访问网址... 我想创建一个与此相似的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

任何想法都可以创建类似于上述装饰器的自定义混合。

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

有人可以帮我吗?

谢谢

1 个答案:

答案 0 :(得分:4)

我们可以制作一个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

,然后在类似这样的视图中使用它:

class MyCustomView(ProductExistsRequiredMixin, View):

    # ...