django升级从1.8升2.x


Django 1.8升级2.x问题点总结


1. 模型中有外键字段加on_delete参数值;

譬如如下model.py,author外键赋值参数里如果没有on_delete=models.CASCADE要加上。
注意不但model模块里面要改,另外migrations包里面生成的也要相应修改,否则下次迁移DB时会出错

class Article(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)

2. 函数包路径变更

URL反向解析查询新的导入路径变成如下

from django.urls import reverse

获取当前站点信息函数据get_current_site()

# 不再用 from django.contrib.sites.models import get_current_site
from django.contrib.sites.shortcuts import get_current_site

setting.py里的日志配置

# 不再使用 django.utils.log.NullHandler
logging.NullHandler

不修改会出现

ValueError: Unable to configure handler ‘null’: Cannot resolve ‘django.utils.log.NullHandler’: No module named ‘django.utils.log.NullHandler’; ‘django.utils.log’ is not a package
logging.NullHandler

3. 伴随py2到py3的变化

django1.8版本可以是python2或python3,到了django2.x版就不能使用python2了,必须3.4以后;

# 查看python + django version
import sys
import django
print(sys.version)
print(django.VERSION)

相应地,发下的改变:
- print改函数的型式, print("output log");
- models中的显示对象函数需要从__unicode__变更到__str_;
- dict去除了has_key()方法,从in代替;

4. 中文版本配置值变更

当你运行时遇到
OSError: No translation files found for default language zh-cn.
的时候,就要把zh-cn改为zh-Hans

LANGUAGE_CODE = 'zh-Hans'

5. 中间件配置里的名字修改

去掉’_CLASSES’

MIDDLEWARE_CLASSES = ( ... ) # 旧
# 改成如下
MIDDLEWARE =  ( ... ) # 新

6. 模板渲染函数名修改

django中render_to_response不建设使用,改为render函数。

7. 关联外键模型赋值要用set

# 弃用 article.related_set = [obj1, obj2] # django 1.8
article.related_set.set([obj1, obj2]) # django2.0 use

8. 去除SessionAuthenticationMiddleware

# 不再需要'django.contrib.auth.middleware.SessionAuthenticationMiddleware',

不去掉会出现如下提示

ImportError: Module “django.contrib.auth.middleware” does not define a “SessionAuthenticationMiddleware” attribute/class

9. url函数引入参数变更

# 弃用 url(r'^manager/', include('admin.site.urls')), # 1.8 
url(r'^manager/', admin.site.urls), # django 2.0

错误提示

django.core.exceptions.ImproperlyConfigured: Passing a 3-tuple to include() is not supported. Pass a 2-tuple containing the list of patterns and app_name, and provide the namespace argument to include() instead.

10. 模板html引入其他模板

# include "./blog/abc.html" # 如果之前模板有这样的语句要改成下面的
include "blog/abc.html"
/latefirstcmt/15