一 问题说明
在创建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 的错误的更多相关文章

  1. 自己用到的解决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 ...

  2. 转载博客(Django2.0集成xadmin管理后台遇到的错误)

    转载博客地址:https://blog.csdn.net/yuezhuo_752/article/details/87916995 django默认是有一个admin的后台管理模块,但是丑,功能也不齐 ...

  3. Django:Python3.6.2+Django2.0配置MySQL

    持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...

  4. Django:Python3.6.2+Django2.0配置MySQL 转载

    Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据库... 我使用的版本是:Py ...

  5. Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑

    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...

  6. Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑(二)

    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...

  7. Python3.6+Django2.0以上 xadmin站点的配置和使用

    1. xadmin的介绍 django自带的admin站点虽然功能强大,但是界面不是很好看.而xadmin界面好看,功能更强大,并完全支持Bootstrap主题模板.xadmin内置了丰富的插件功能. ...

  8. 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.安装相 ...

  9. django2.0集成xadmin0.6报错集锦

    1.django2.0把from django.core.urlresolvers修改成了django.urls 报错如下: 1 2 3   File "D:\Envs\django-xad ...

随机推荐

  1. 精通awk系列(13):print、printf、sprintf和重定向

    回到: Linux系列文章 Shell系列文章 Awk系列文章 输出操作 awk可以通过print.printf将数据输出到标准输出或重定向到文件. print print elem1,elem2,e ...

  2. python程序员面试高概率会遇到的技术问题

    本篇只列举会问到的技术问题.其他的问题会在另一篇文章多年职场老狗的面试经验提到. 1. TCP三次握手和四次挥手的过程 2.HTTP协议的状态码 3.讲一下自己用过的设计模式 4.python的多线程 ...

  3. 使用 Redis 进行阅读数统计并定时持久化

    之前,统计每篇博文的阅读数的方式是经过筛选去重之后直接更新数据库,并发压力直接传导到数据库,假设1秒有1000个并发请求,传统方案会在1秒内并发进行1000次数据库更新操作. 为了降低数据库的并发压力 ...

  4. vue app项目 第一天 基本架构和路由配置

    一.前言 今天开始打算花6天时间 完成一个基于vue的买菜app 在这里记录一下项目的流程和第一次做这个项目遇到的坑 以及解决的办法 二.第一步 脚手架的安装 使用npm 安装好脚手架  安装脚手架教 ...

  5. 使用函数计算三步实现深度学习 AI 推理在线服务

    目前深度学习应用广发, 其中 AI 推理的在线服务是其中一个重要的可落地的应用场景.本文将为大家介绍使用函数计算部署深度学习 AI 推理的最佳实践,  其中包括使用 FUN 工具一键部署安装第三方依赖 ...

  6. react中报错Failed to set an indexed property on 'CSSStyleDeclaration': Index property setter is not supported

    产生这个报错的原因是我当时将样式写到了less文件,我在div中使用的使用应该是使用className = ,而我误写了一个style = .style里面当然没有自定义的className,所以产生 ...

  7. golang 安装脚本

    #!/bin/bash env sudo yum -y install wget curl echo "download golang ..." # 获取最新的golangurl ...

  8. PyCharm 快捷键失效解决办法

    PyCharm快捷键用着用着失效了 ......修改设置如下 重新启动Pycharm即可 原博客地址:https://blog.csdn.net/jacke121/article/details/82 ...

  9. 23.login1(SKCTF)

    没有账号?注册一个试一试~ 题目提示用SQL约束攻击,那么什么是SQL约束攻击呢? 约束攻击的原理就是注册用户名为'admin    '(有多个空格)的账号,密码'*******'(密码可以自定义,符 ...

  10. a minimum of subsistence

    A hundred years ago it was assumed and scientifically "proved" by economists that the laws ...