Ubuntu里使用virtualenv改变当前python版本使得Django能正确显示中文网页

背景介绍:

在项目开发初期,在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 <module>
    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.尝试打开网页,成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值