解决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=64)
contact = models.CharField(max_length=32)
phone = models.CharField(max_length=32)
address = models.CharField(max_length=128)
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[0], _(u‘Today‘), input_html[1], _(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[0] = input_html[0] + "/>"
input_html[1] = "<" + input_html[1]

原文地址:https://www.cnblogs.com/zmdComeOn/p/11966117.html

时间: 2024-10-24 19:31:37

解决Python3.6.5+Django2.0集成xadmin后台点击添加或者内容详情报 list index out of range 的错误的相关文章

Django2.1集成xadmin管理后台错误解决

django2.0集成xadmin0.6报错集锦 转载https://blog.csdn.net/Vicco_Cc/article/details/81045194 1.django2.0把from django.core.urlresolvers修改成了django.urls 报错如下: 1 2 3   File "D:\Envs\django-xadmin\lib\site-packages\xadmin-0.6.1-py3.6.egg\xadmin\models.py", lin

解决python3读写中文txt时UnicodeDecodeError : &#39;ascii&#39; codec can&#39;t decode byte 0xc4 in position 5595: ordinal not in range(128) on line 0的问题

今天使用python3读写含有中文的txt时突然报了如下错误,系统是MAC OS,iDE是pycharm: UnicodeDecodeError : 'ascii' codec can't decode byte 0xc4 in position 5595: ordinal not in range(128) on line 0 按理说python3的默认编码是unicode,不应该出现这种错误,排查以后发现问题及解决方案如下: import locale print(locale.getpre

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

django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节奏,那么在集成过程中咱就一步一步填坑吧,这也是一种学习的过程,遇到错误,找到错误的地方,看看django最新升级都修改了那些,去掉了那些,把相应出错的地方替换即可. xadmin源码地址:https://github.com/sshwsfc/xadmin 下载并解压: 我们用到的是xadmin文件夹

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

django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节奏,那么在集成过程中咱就一步一步填坑吧,这也是一种学习的过程,遇到错误,找到错误的地方,看看django最新升级都修改了那些,去掉了那些,把相应出错的地方替换即可. xadmin源码地址:https://github.com/sshwsfc/xadmin 下载并解压: 我们用到的是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.安装相应的xadmin2 pip install xadmin2 x 1 pip install xadmin2 C:\Users\mayafeng\Downloads>pip install xadmin-django2.zip Processing c:\users\mayafeng\downloads\

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

1.django2.0把from django.core.urlresolvers修改成了django.urls 报错如下: 1 2 3   File "D:\Envs\django-xadmin\lib\site-packages\xadmin-0.6.1-py3.6.egg\xadmin\models.py", line 8, in <module>     from django.core.urlresolvers import NoReverseMatch, rev

python3.5下django2.0使用pymysql连接mysql

创建数据库 create database haha default charset=utf8; 安装pymysql pip install PyMySQL 应用中的setting.py设置如下 import pymysql pymysql.install_as_MySQLdb() DATABASES = {     'default': {     'ENGINE': 'django.db.backends.mysql',     'NAME': 'mysite',     'USER': '

【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建

由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: 笔者的工作系统环境:Mac 10.13.4+Python3.6.x+Django2.0.x+Xadmin2.0 因此本系列教程均是以此组合为基础展开讲解.其他系统版本也基本适用,有小部分不兼容之处请自行测试. 一.Django及xadmin安装 可以使用pip命令进行安装,或者直接下载安装包用py

CentOS + Python3.6+ Django2.0 + uwsgi + nginx + mysql web发布环境搭建

目录: CentOS上升级Python 安装easy_install和pip uwsgi安装及测试 Django安装及测试 连接uwsgi与Django nginx安装及测试 连接uwsgi与nginx 连接uwsgi与Django与nginx uwsgi ini mysql安装设置 python3 Django mysql连接及测试 快速搭建blog测试 Pycharm开发 如果只是想学习django开发直接用django本身自带的开发用服务器即可. 1. CentOS上升级Python 用的