解决Python3.6.5+Django2.0集成xadmin后台点击添加或者内容详情报 list index out of range 的错误
一 问题说明
在创建Model的时候,如果存在类型是DateTimeField的字段,则在xadmin后端管理界面里,对该Model进行添加操作的时候,会报list index out of range。
这是上篇文章创建的Model:
class IDC(models.Model):
name = models.CharField(max_length=)
contact = models.CharField(max_length=)
phone = models.CharField(max_length=)
address = models.CharField(max_length=)
create_time = models.DateField(auto_now=True) def __str__(self):
return self.name class Meta:
verbose_name = "IDC机房"
verbose_name_plural = verbose_name
将该Model的create_time字段类型修改如下:
create_time = models.DateTimeField()
然后登录xadmin系统,进入“IDC机房”管理界面,点击添加按钮,即会重现该问题。
二 问题原因
首先,报错信息里已经指出了报错的代码:
venv\lib\site-packages\xadmin\widgets.py in render, line 80
按照提示的目录,找到具体的代码:
def render(self, name, value, attrs=None):
input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('\n') if ht != '']
# return input_html
return mark_safe('<div class="datetime clearfix"><div class="input-group date bootstrap-datepicker"><span class="input-group-addon"><i class="fa fa-calendar"></i></span>%s'
'<span class="input-group-btn"><button class="btn btn-default" type="button">%s</button></span></div>'
'<div class="input-group time bootstrap-clockpicker"><span class="input-group-addon"><i class="fa fa-clock-o">'
'</i></span>%s<span class="input-group-btn"><button class="btn btn-default" type="button">%s</button></span></div></div>' % (input_html[], _(u'Today'), input_html[], _(u'Now')))
上面贴出来的最后一行代码就是widgets.py的第80行代码。
input_html[1]就是报错的代码,因为input_html里只有一个元素,从报错信息里也能找到input_html的值如下:
['<input type="text" name="create_time_0" class="date-field form-control '
'admindatewidget" size="10" required id="id_create_time_0" /><input '
'type="text" name="create_time_1" class="time-field form-control '
'admintimewidget" size="8" required id="id_create_time_1" />']
阅读代码后,可以看出下面这句代码是希望用“\n”把input_html里的两个标签拆开,但两个标签之间没有换行,所以没能拆分,导致报错。
input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('\n') if ht != '']
但是,作者当初这样写,肯定是能把两个拆开的,为什么忽然不行了呢?
继续查看两个标签的生成代码,发现其来源于以下模板:
venv\Lib\site-packages\django\forms\templates\django\forms\widgets\multiwidget.html
该html模板代码如下:
{% spaceless %}{% for widget in widget.subwidgets %}{% include widget.template_name %}{% endfor %}{% endspaceless %}
spaceless标签:
用法:{% spaceless %}…内容…{% endspaceless %}
含义:删除包围内容中的所有tab或者回车字符
看到spaceless,猜测问题就出在这个标签上,推测这个标签是Django后来的版本加上去的。
查看Django的代码提交记录,验证了猜测,在Django2.0.1版本和1.11.9版本,看到了追加spaceless标签的提交记录,提交记录如下:
https://github.com/django/django/commit/47681af34447e5d45f3fdb316497cdf9fbd0b7ce
https://github.com/django/django/commit/c1d57615ac60171a73e1922a48ebc27fe513357e
三 解决问题
方案一
既然问题是由于模板文件追加了spaceless标签导致的,那么删除spaceless标签,将模板代码改成如下形式,是不是就能解决问题呢?
{% for widget in widget.subwidgets %}{% include widget.template_name %}{% endfor %}
答案是肯定的,确实可以解决问题。
不过,spaceless标签是Django作为bug修复追加的代码,不建议删除,删除后,不清楚在其他地方会不会出现问题。
方案二
既然“\n”不能拆分标签,那么就换一种拆分方式,使用“/><”拆分。
原代码:
input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('\n') if ht != '']
修改后代码:
input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/><') if ht != '']
input_html[] = input_html[] + "/>"
input_html[] = "<" + input_html[]
解决Python3.6.5+Django2.0集成xadmin后台点击添加或者内容详情报 list index out of range 的错误的更多相关文章
- 自己用到的解决Python3.6.5+Django2.0集成xadmin后台点击添加或者内容详情报 list index out of range 的错误的办法如下:
Python3.6.5 Django2.0 这是Django版本与xadmin兼容的问题 解决办法如下: 注释掉如下代码: def render(self, name, value, attrs=No ...
- 转载博客(Django2.0集成xadmin管理后台遇到的错误)
转载博客地址:https://blog.csdn.net/yuezhuo_752/article/details/87916995 django默认是有一个admin的后台管理模块,但是丑,功能也不齐 ...
- Django:Python3.6.2+Django2.0配置MySQL
持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...
- Django:Python3.6.2+Django2.0配置MySQL 转载
Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据库... 我使用的版本是:Py ...
- Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑
django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...
- Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑(二)
django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...
- Python3.6+Django2.0以上 xadmin站点的配置和使用
1. xadmin的介绍 django自带的admin站点虽然功能强大,但是界面不是很好看.而xadmin界面好看,功能更强大,并完全支持Bootstrap主题模板.xadmin内置了丰富的插件功能. ...
- python3.0安装django2.0、xadmin
1.操作环境 Windows10.python3.8 2.安装django2.0 pip install django==2.0 x 1 pip install django==2.0 3.安装相 ...
- django2.0集成xadmin0.6报错集锦
1.django2.0把from django.core.urlresolvers修改成了django.urls 报错如下: 1 2 3 File "D:\Envs\django-xad ...
随机推荐
- 4 Best Time to Buy and Sell Stock III_Leetcode
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 《BI那点儿事》数据流转换——模糊分组转换
在模糊查找中我们提到脏数据是怎样进入到表中的事情,主要还是由于一些“Lazy-add”造成的.这种情况我们的肉眼很容易被欺骗,看上去是同一个单词,其实就差那么一个字母,变成了两个不同的单词.一个简单的 ...
- 第五天:内置对象(7.Javascript内置对象)
1)中所术是内置对象,2)中为自定义对象 代码说明如下 2.1.1 定义并创建对象实例方式1,代码如下: <!DOCTYPE html><html lang="en&quo ...
- SQL SERVER安装提示“安装了 Microsoft Visual Studio 2008 的早期版本
工作共遇到的问题记录: 安装Sql Server 2008 R2时提示错误:“此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2 ...
- OCP-1Z0-051-题目解析-第10题
10. View the Exhibit and examine the structure of the PROMOTIONS table. Each promotion has a duratio ...
- 如何将mysql数据导入Hadoop之Sqoop安装
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle , ...
- C语言之递归
递归例子如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; digui(n); ; } void digui ...
- 杭电ACM2013--蟠桃记
蟠桃记 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- C++ 中的不定参数与格式化字符串 # ## vsprintf
日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下. 格式化字符串有很多方法: snprintf std::stringstream # ##的使用 ##是一个连接符号,用于把参数连在一 ...
- 03-03:springBoot 整合thymeleaf
thymeleaf 语法详解1.变量输出: th:text :在页面中输出某个值 th:value :将一个值放到input标签中的value中.2.判断字符串是否为空 ①:调用内置对象一定要用# ② ...