当 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管理后台所遇到的错误集锦,解决填坑

Django2.1.1与xadmin0.6.0遇到的坑

Django2.1.1与xadmin0.6.0遇到的坑

Django2.0安装配置xadmin错误及解决方法

python 3.5 django2.2.8 安装xadmin

python3.0安装django2.0xadmin