【问题标题】:Get current user in djangocms plugins (CMSPluginBase)在 djangocms 插件 (CMSPluginBase) 中获取当前用户
【发布时间】:2021-02-24 15:20:52
【问题描述】:

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

@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, context, instance, placeholder):
        req = get_current_request()
        query_set = Article.objects.filter(contact=req.user)

【问题讨论】:

    标签: django django-cms


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多