码迷,mamicode.com
首页 > 其他好文 > 详细

当 Xadmin 插件编写 遇到 Django2.x与Pyhton3.x

时间:2018-06-04 11:41:48      阅读:801      评论:0      收藏:0      [点我收藏+]

标签:one   lse   bsp   png   没有   ret   pyhton   def   load   

主要的问题是来自于慕课网的(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

标签:one   lse   bsp   png   没有   ret   pyhton   def   load   

原文地址:https://www.cnblogs.com/AbyssViper/p/9131651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!