把项目从django1.3升级到django1.4
1、注意不要下错版本,我因为没注意在github上下了文件名为1.4但实际是1.5的开发版,后面出现了很多奇奇怪怪的问题,浪费好久的时间,还纳闷为什么1.4的老显示django 1.5呢?1.5不是还没发布吗?
2、目录结构发生改变,settings.py和urls.py移到一个跟项目同名的App里面,根目录下只留manage.py,并且这个文件的内容跟旧版内容也已经不一样,根据官方文档说明,旧的manage.py仍可使用,但在1.5里将出现不推荐使用的警告,而到1.6,将不再可用。如果是把别的1.4的manage.py复制到将要升级的项目里,记得修改:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "laonan.settings")
里面的settings改为要升级的项目的名称。
3、settings.py在时区设置,App位置等有所改变,比如在1.3里,我的博客内App的设置如下:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.flatpages',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.redirects',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
'django.contrib.admindocs',
'photologue',
'laonan.accounts',
'laonan.captcha',
'laonan.blog',
'laonan.utils',
)
在1.4 中将变成:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.flatpages',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.redirects',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
'django.contrib.admindocs',
'photologue',
'accounts',
'captcha',
'blog',
'utils',
)
代码中的其它import也类似,不能再以"{{ project_name }}.{{ app_name }}"的方式,而是直接"{{ app_name }}"。
4、以前用于放置自定义template filters的templatetags目录,不能再直接放在根目录下,要放在某个具体的App里面,我把它移到了laonan里,跟settings.py和urls.py平级。
5、从URLFields里移除verify_exists. 因为性能和安全原因,在新版的django里不再支持verify_exists.我以前因为debug时这个字段老是去验证,有时候带来一些麻烦,所以一般都设为false,点击见详情这时候把它移除之。
6、django.conf.urls.defaults被废弃,改为django.conf.urls.
7、MIDDLEWARE_CLASSES配置增加django.middleware.clickjacking.XFrameOptionsMiddleware,用于防止clickjacking.
8、更新manage.py内容,可以在安装好django1.4后用startproject命令生成一个,替换掉旧的,注意里面的App名保持跟project一致。
9、增加 require_debug_false filter到logging settings里:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
10、移除ADMIN_MEDIA_PREFIX设置。
11、第3点说过时区设置的变化,就是在增加USE_TZ = True,这个改变带来一些编码上的改变,以前获取当前时间是这样的:
import datetime
now = datetime.datetime.now()
现在改为:
import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
12、移植函数式的generic views(不移值会出现警告,但不出错)。
from django.views.generic.simple import direct_to_template
url(r'xxxx/$', direct_to_template, { 'template' :'my_template.html'})
改为:
from django.views.generic.base import TemplateView
url(r'xxxx/$', TemplateView.as_view(template_name='my_template.html'))
更详细见官方文档
13、url标签更改(不更改不会报错,但会有警告,这个特性也是1.3 就有了的):
{% url app_name.view_name value1, value2 %}
改为:
{% load url from future %}
{% url 'app_name.view_name' arg1=value1 arg2=value2 %}
其中 {% load url from future %}一个页面只要顶上有一句就行。
官方文档说明
14、管理界面的css有调整,需要把旧的替换掉,不然可能会有找不到图片之类的小问题存在
15、更多去除警告的小技巧一枚:用$ python -Wall manage.py runserver命令检查代码,如果有警告,改之。