如何将mixin应用于Django应用程序中的所有cbv?

2024-06-16 09:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想使用自己创建的LoginRequiredMixin和UserPermissionMixin,并将它们应用于应用程序中的所有视图。这只是一个例子,我可能也有一些混音添加一些上下文或做其他事情

我可以手动执行,例如以下视图:

class MyCreateView(LoginRequiredMixin, UserPermissionMixin, CreateView)

但是,由于我有很多视图,并且可能有其他特定的视图混合,所以这会变得混乱并且难以管理

想到的一个解决方案是为泛型视图创建新类:

class DecoratedCreateView(LoginRequiredMixin, UserPermissionMixin, CreateView):
    pass


class DecoratedDetailView(LoginRequiredMixin, UserPermissionMixin, DetailView):
    pass


class DecoratedUpdateView(LoginRequiredMixin, UserPermissionMixin, UpdateView):
    pass


class DecoratedDeleteView(LoginRequiredMixin, UserPermissionMixin, DeleteView):
    pass

然后,使用这些作为我的通用视图:

class MyCreateView(DecoratedCreateView)

这是个好办法吗?我是否必须在上面的类中添加任何方法,还是将它们留空就可以按预期工作? 有没有其他方法可以实现这一点,也许在url.py中


Tags: 方法视图应用程序pass手动解决方案事情class
1条回答
网友
1楼 · 发布于 2024-06-16 09:03:09

你的方法很好。我在一些项目中这样做有点不同:

myapp/views/generic.py

from django.views.generic import (
    CreateView as BaseCreateView,
    DetailView as BaseDetailView,
    UpdateView as BaseUpdateView,
    DeleteView as BaseDeleteView,
)

__all__ = ['MyappMixin', 'CreateView', 'DetailView', 'UpdateView', 'DeleteView']


class MyappMixin(LoginRequiredMixin, UserpermissionMixin):
    pass


class CreateView(MyappMixin, BaseCreateView):
    pass


class DetailView(MyappMixin, BaseDetailView):
    pass


class UpdateView(MyappMixin, BaseUpdateView):
    pass


class DeleteView(MyappMixin, BaseDeleteView):
    pass

myapp/views/base.py

from .generic import CreateView

class MyCreateView(CreateView):
    pass

它工作良好,没有太多的麻烦,并允许您轻松地跳过混合异常,如果需要的话

根据用例,另一种解决方案可能是使用middlewarescontext processors

class MyMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        is_in_myapp = request.resolver_match.app_name == 'myapp'
        if is_in_myapp and not request.user.is_authenticated:
            response = HttpResponse("Permission denied", status=403)
        else:
            response = self.get_response(request)
        return response

相关问题 更多 >