微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在djangocms插件CMSPluginBase中获取当前用户

如何解决在djangocms插件CMSPluginBase中获取当前用户

我想创建一个插件,其内容根据打开页面用户而有所不同。 我尝试过:

@plugin_pool.register_plugin  # register the plugin
class RubriquePluginPublisher(CMSPluginBase):
    """
    RubriquePluginPublisher : CMSPluginBase
    """
    model = RubriquePluginModel  # model where plugin data are saved
    module = "Rubrique"
    name = "Rubrique plugin"  # name of the plugin in the interface
    render_template = "commission/rubrique_plugin.html"

    def render(self,context,instance,placeholder):
        context.update({'instance': instance})
        query_set = Article.objects.filter(rubriques=instance.rubrique).filter(contact=self.request.user)
        page = context['request'].GET.get('page_{}'.format(instance.rubrique.name)) or 1
        paginator,page,queryset,is_paginated = self.paginate_queryset(page,query_set,3)
        context.update({'paginator': paginator,'page_obj': page,'is_paginated': is_paginated,'articles': queryset
                        })
        return context

但是self.request在CMSPluginBase类中不存在。 如何访问当前用户

编辑: 我找到了解决方法。我创建了一个中间件,该中间件返回当前请求。效果很好,但是如果有人有更好的解决方案,请不要犹豫。

from django.utils.deprecation import MiddlewareMixin

_requests = {}

def get_current_request():
    t = current_thread()
    if t not in _requests:
         return None
    return _requests[t]

class RequestMiddleware(MiddlewareMixin):
    def process_request(self,request):
        _requests[current_thread()] = request
@plugin_pool.register_plugin  # register the plugin
class PrivateRubriquePluginPublisher(CMSPluginBase):
    def render(self,placeholder):
        req = get_current_request()
        query_set = Article.objects.filter(contact=req.user)

解决方法

据我所知,推荐的方法是:

  1. 在settings.py中将django.template.context_processors.request添加到您的context_processors中-这会将request变量添加到您的上下文中。
  2. 然后在CMSPluginBase.render中,您可以按以下方式访问它:
    def render(self,context,instance,placeholder):
        context = super().render(context,placeholder)
        request: HttpRequest = context['request']

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。