在项目开发初期,在Ubuntu使用的是python2.7来配合Django学习建站,后来在网站里添加中文内容的时候,网页因为python2.7的缘故无法解码中文字符而无法正确显示。
(ll_env) cheng@cheng-virtual-machine:~/Django_project/learning_logs$ pip list
Package Version
------------- -------
Django 1.11.20
pip 19.0.3
pkg-resources 0.0.0
pytz 2018.9
setuptools 40.8.0
wheel 0.33.1
(ll_env) cheng@cheng-virtual-machine:~/Django_project$ python -V
Python 2.7
Django version 1.11.20
python version 2.7
默认情况下,python2.7使用的不是utf-8字符串解码,而python3.x使用的是utf-8.
所以我这里的想法是,将当前的虚拟机的python版本升级到python3.x。
1.首先deactivate 当前的虚拟机环境
安装了virtualenv的话,在终端输入deactivate即可。
2.删除虚拟机的环境目录
rm -rf <虚拟环境目录文件名>
3.新建虚拟机环境,设定python版本为python3
virtualenv -p /usr/bin/python3 <目录名>
如下
cheng@cheng-virtual-machine:~/Django_project$ virtualenv -p /usr/bin/python3 ll_env
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/cheng/Django_project/ll_env/bin/python3
Also creating executable in /home/cheng/Django_project/ll_env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
4.激活虚拟环境
cheng@cheng-virtual-machine:~/Django_project$ source ll_env/bin/activate
5.查看当前虚拟环境python版本
(ll_env) cheng@cheng-virtual-machine:~/Django_project$ python -V
Python 3.6.7
6.查看虚拟环境安装包
(ll_env) cheng@cheng-virtual-machine:~/Django_project$ pip list
Package Version
------------- -------
pip 19.0.3
pkg-resources 0.0.0
setuptools 40.8.0
wheel 0.33.1
发现没有安装Django, pip install Django
安装Django
(ll_env) cheng@cheng-virtual-machine:~/Django_project$ pip install Django
Collecting Django
Downloading https://files.pythonhosted.org/packages/c7/87/fbd666c4f87591ae25b7bb374298e8629816e87193c4099d3608ef11fab9/Django-2.1.7-py3-none-any.whl (7.3MB)
100% |████████████████████████████████| 7.3MB 4.7MB/s
Collecting pytz (from Django)
Using cached https://files.pythonhosted.org/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl
Installing collected packages: pytz, Django
Successfully installed Django-2.1.7 pytz-2018.9
7.更新一下数据库
python manage.py migrate
出现如下告错TypeError: __init__() missing 1 required positional argument: 'on_delete'
(ll_env) cheng@cheng-virtual-machine:~/Django_project$ python manage.py migrate
Traceback (most recent call last):
.........
File "/home/cheng/Django_project/learning_logs/models.py", line 15, in
class Entry(models.Model):
File "/home/cheng/Django_project/learning_logs/models.py", line 17, in Entry
topic = models.ForeignKey(Topic)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
8.原因当前的Django版本已有之前的1.x升级到2.x, 需要修改外键的参数,如下
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Topic(models.Model):
"""用户学习的主题"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
class Entry(models.Model):
"""学到的有关某个主题的具体知识"""
topic = models.ForeignKey(Topic,on_delete=models.CASCADE) ##在Django1.x版本会默认参数on_delete=models.CASCADE, 而在Django2.x需要指定
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
"""返回模型的字符串表示"""
return self.text[:50] + "..."
9.修改后再次迁移数据库,成功。
参考:https://www.cnblogs.com/phyger/p/8035253.html
(ll_env) cheng@cheng-virtual-machine:~/Django_project$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying auth.0009_alter_user_last_name_max_length... OK
10.尝试打开网页,成功!