当 Xadmin 插件编写 遇到 Django2.x与Pyhton3.x
Posted AbyssViper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当 Xadmin 插件编写 遇到 Django2.x与Pyhton3.x相关的知识,希望对你有一定的参考价值。
主要的问题是来自于慕课网的(Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台)
需求:给xadmin添加一个导入csv的插件
环境:python3.6.5 + Django2.0.1
观看了这个课程插件编写的部分,存在版本的差异。
—————————————————————————————————————————————————————————
【1】 右上角导入插件带来的问题
导入插件看了https://www.cnblogs.com/lanqie/p/8340215.html#commentform 这个博文写的,带来的一个问题就是
Django 新版本已经更改了loader.render_to_string 这个函数,以前这里需要
1 nodes.append( 2 loader.render_to_string(\'xadmin/plugins/model_list.top_toolbar.importexport.import.html\', 3 context_instance=context))
【注意】: 如果说这里为什么必须传入context, 可以打印输出一下context。里面最重要的是包含了csrf的令牌。如果这里删除的话,导入文件会爆出csrf 403.
然后 根据错误找到源码发现
1 def render_to_string(template_name, context=None, request=None, using=None): 2 """ 3 Load a template and render it with a context. Return a string. 4 5 template_name may be a string or a list of strings. 6 """ 7 if isinstance(template_name, (list, tuple)): 8 template = select_template(template_name, using=using) 9 else: 10 template = get_template(template_name, using=using) 11 return template.render(context, request)
render_to_string的参数已经不是context_instance 而是context。
网上有的直接传入的参数是
1 nodes.append( 2 loader.render_to_string(\'xadmin/plugins/model_list.top_toolbar.importexport.import.html\', 3 context))
这是错误的,
context在这里是个RequestContext的类,而render_to_string要接受的并不是这个格式
查看其他xadmin自带的插件发现写的方法是、
1 from xadmin.plugins.utils import get_context_dict
1 nodes.append( 2 loader.render_to_string(\'xadmin/plugins/model_list.top_toolbar.importexport.import.html\', 3 get_context_dict(context)))
如果你的版本没有get_context_dict 这个函数。可以从下直接复制导入即可
get_context_dict :
1 from django.template.context import RequestContext 2 3 4 def get_context_dict(context): 5 """ 6 Contexts in django version 1.9+ must be dictionaries. As xadmin has a legacy with older versions of django, 7 the function helps the transition by converting the [RequestContext] object to the dictionary when necessary. 8 :param context: RequestContext 9 :return: dict 10 """ 11 if isinstance(context, RequestContext): 12 ctx = context.flatten() 13 else: 14 ctx = context 15 return ctx
———————————————————————————————————————————————————————————————————————————
【2】 后续有版本坑随时更新
以上是关于当 Xadmin 插件编写 遇到 Django2.x与Pyhton3.x的主要内容,如果未能解决你的问题,请参考以下文章
Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑