如何解决在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)
解决方法
据我所知,推荐的方法是:
- 在settings.py中将
django.template.context_processors.request
添加到您的context_processors
中-这会将request
变量添加到您的上下文中。 - 然后在
CMSPluginBase.render
中,您可以按以下方式访问它:
def render(self,context,instance,placeholder):
context = super().render(context,placeholder)
request: HttpRequest = context['request']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。