本文摘自php中文网,作者coldplay.xixi,侵删。

相关免费学习推荐:python视频教程
1.Django xadmin数据迁移报错ImportError: cannot import name ‘QUERY_TERMS’
在进行Django xadmin数据迁移时报错:
from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS
ImportError: cannot import name'QUERY_TERMS'from'django.db.models.sql.query'(C:\Users\LENOVO\.virtualenvs\Django_Vue_Fresh_Ecommerce-NKba4OvD\lib\site-packages\django\db\models\sql\query.py)
由于xadmin的更新跟不上Django的更新,因此导致了xadmin的很多代码出错,需要进行修改,这里将xadmin\plugins\filters.py中from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS修改为from django.db.models.sql.query import LOOKUP_SEP, Query,还需要将47行的if len(parts) > 1 and parts[-1] in Query:修改为if len(parts) > 1 and parts[-1] in QUERY_TERMS:。
2.Django xadmin报错TypeError: render() got an unexpected keyword argument ‘renderer’
在Django登录进入xadmin后台时,在添加小部件时,会报错,如下:
returnwidget.render(TypeError: render() got an unexpected keyword argument'renderer'
解决办法有两种:
-
修改Django源码
找到lib\site-packages\django\forms\boundfield.py,找到第96行,注释掉即可,如下:
returnwidget.render(
name=self.html_initial_nameifonly_initialelseself.html_name,
value=self.value(),
attrs=attrs,
# renderer=self.form.renderer,)
此时再点击Add Budgets就不会再报错了。
-
修改xadmin代码
在xadmin/views/dashboard.py中修改render()函数,第36行改为def render(self, name, value, attrs=None, renderer=None):,即增加renderer参数为None。
两种方法皆可,但是个人建议采用第二种方法,因为xadmin是外部引入到extra_apps作为外部的app,本身就可能经过了一定修改,在此基础上再修改也影响不大,而django是虚拟环境所带的依赖库,相当于是系统文件,因此不要轻易修改。
3.Django xadmin报错RuntimeError: isn’t in an application in INSTALLED_APPS.
在进行数据库映射时,报错如下:
raise RuntimeError(RuntimeError: Modelclassdjango.contrib.admin.models.LogEntry doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
解决办法是在settings.py中的INSTALLED_APPS中增加django.contrib.admin,如下:
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps.users.apps.UsersConfig',
'goods',
'trade',
'user_operation',
'DjangoUeditor',
'xadmin',
'crispy_forms',
'django.contrib.admin']
4.Django配置Restful framework报错__str__ returned non-string (type NoneType)
在Django项目中配置Restful framework时,报错__str__ returned non-string (type NoneType),如下:
这可能是自定义用户模型代替Django自带的用户模型时,允许name(或相似的)字段允许为空,例如name = models.CharField(max_length=30, null=True, blank=True, verbose_name='姓名')所以会返回non-string报错,完整模型如下:
classUserProfile(AbstractUser):
'''用户'''
name = models.CharField(max_length=30, null=True, blank=True, verbose_name='姓名')
birthday = models.DateField(null=True, blank=True, verbose_name='出生日期')
gender = models.CharField(max_length=6, choices=(('male', u'男'), ('female', u'女')),default='female',
verbose_name='性别')
mobile = models.CharField(max_length=11, verbose_name='电话')
email = models.CharField(max_length=50, null=True, blank=True, verbose_name='邮箱')
is_delete = models.BooleanField(default=False, verbose_name='是否删除')
classMeta:
verbose_name ='用户'
verbose_name_plural ='用户'
def __str__(self):
returnself.name
解决办法有2种:
-
退出admin或xadmin后台登录
退出后台管理登录,操作如下:
-
修改用户模型__str__()方法
因为自定义用户如UserProfile继承自AbstractUser,而AbstractUser模型有username属性,不允许为空,所以可以设置为返回self.username,即如下:
def __str__(self):
returnself.username
此时不登出后台管理也可以正常访问。
5.DRF报错AssertionError:basenameargument not specified
在Restful framework中使用过滤器时报错:
assert queryset is not None,'`basename` argument not specified, and could '\
AssertionError: `basename` argument not specified,andcould not automatically determine the name from the viewset,asit does not have a `.queryset` attribute.
报错提示很明显,assert queryset不是None,未指定“basename”参数,显然需要在使用router定义路由时指定basename参数,如下:
router = DefaultRouter()# 配置goods的路由router.register(r'goods', GoodsListViewSet,basename='goods')
即在urls.py中使用router配置路由时加入basename参数即可。
6.UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list
paginator = self.django_paginator_class(queryset, page_size)
在Django Restful framework中实现视图时对某一类数据进行分页并在前端请求访问数据时显示警告信息如下:
XXX\lib\site-packages\rest_framework\pagination.py:200: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class'goods.models.Goods'> QuerySet.
paginator = self.django_paginator_class(queryset, page_size)
相关阅读 >>
更多相关阅读请进入《Python》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。