在django创建自定义mixin?

我有一个装饰器,它阻止用户如果产品有用访问URLid=1没有被激活。

I want to create a mixin similar to this.

This is my decorator:

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

一个想法如何创建类似于上面的装饰者的自定义mixin?

我想为基于类的视图创建MixIn。

任何人都帮助我了吗?

你也分享你的观点?Eseuling
你的意思是我想把我的混音的意见?Niladry Kar

回答 1

  1. 赞同 21

    We can make a Mixin that just overrides the 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):
    
        # ...

    Willem Van Onsem
    我不明白谁“超级()”,因为ProductExistRequiredmixin不会继承任何东西?Logiconabstactions
    @ logiconabstractions:mro中的下一个项目。所以,如果我们在MyCustomViewInheritProductExistsRequiredMixinView,那将是dispatchView.但是如果我们从另一种覆盖的视图中继承dispatch然后,这将是MRO中的第一个项目。Willem Van Onsem
    Facepalm.享受很多意义的yes。在django之外,既然我总是被告知它是恶魔,就没有多种继承。谢谢。Logiconabstactions