最近学习了Python编程:从入门到实践的第三个项目,Web应用程序。书上项目实现时,遇到了许多问题,问题的主要原因基本都是由于Django已经更新到2.1.4版本了,书中的代码还是采用的1.8.5版本。

为了帮助后面的新同学快速避坑,迅速解决书中代码无法实现的问题,现将学习中遇到的问题进行汇总,欢迎留言补充……。

本人系统环境:

WIN10系统家庭版
Python 3.7.1
Django 2.1.4
书本环境:
Python 3.x
Django 1.8.5
解决版本问题的初级方法
如果你想按照书中的代码实现项目,可以执行在CMD窗口执行卸载命令卸载Django,然后安装书中的用到的版本,命令如下:
卸载命令:pip uninstall Django
安装命令:pip install Django=1.8.5
补充问题1:有些同学采用pip命令时候可能会提示pip版本过低,先将pip升级:
升级命令:python -m pip install -U pip
或者 python -m pip install --upgrade pip
补充问题2:由于网络问题采用pip命令安装失败,可以在官网或者阿里云下载whl源文件到本地,然后安装,具体方法见我另外一篇博文:
建议大家还是采用最新的版本,通过修改代码实现文中的项目,先将问题按章节进行列出
第18章 18.1.3 创建虚拟工作环境
书中是写的在终端中切换到目录learning_log,并像下面这样创建一个虚拟环境:
virtualenv ll_env
运行后出现错误,代码应改写为:
python -m venv 11_env
然后项目文件夹下就创建了虚拟环境所在的文件夹11_env
第18章 18.1.6 在Django中创建项目
有的同学提到由于Django采用PIP安装的,创建项目采用以下命令会出现错误:
django-admin.py startproject learning_log .
我的Django也是pip安装的,但是采用上面和下面的代码都可以正确的创建项目:
django-admin startproject learning_log .
第18章 18.2.4 在Django 定义模型Entry
定义模型里面有定义一个外键,书中代码为:
topic = models.ForeignKey(Topic)
运行会提示缺少on_delete参数,因为在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错,例如user=models.OneToOneField(User,on_delete=models.CASCADE),因此,代码修改为:
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
关于on_delete参数的说明:
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

CASCADE:此值设置,是级联删除。

PROTECT:此值设置,是会报完整性错误。

SET_NULL:此值设置,会把外键设置为null,前提是允许为null。

SET_DEFAULT:此值设置,会把设置为外键的默认值。

SET():此值设置,会调用外面的值,可以是一个函数。

一般情况下使用CASCADE就可以了。具体可以参考官方文档:

https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey

第18章 18.2.6 向管理网站注册Entry

运行书中步骤后,返回网站,并没有看到Entries,只需要关闭虚拟环境,关闭浏览器,重新打开CMD,激活虚拟环境,运行python manage.py runserver,然后打开浏览器。

第18章 18.3.1 映射URL

文中源代码为:

from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r’^admin/’, include(admin.site.urls)),
url(r’’, include(‘learning_logs.urls’, namespace=‘learning_logs’)),
]

如果采用文中源代码,运行python manage.py runserver查看项目,会出现错误,错误提示中会出现类似namespace的错误,没有app_name等的错误,需要在代码开始前添加app_name的定义。

由于Django2.0之后版本已经修改代码格式,这里需要修改为以下代码:

from django.contrib import admin
from django.urls import path, include
app_name=‘learning_logs’
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(’’, include(‘learning_logs.urls’, namespace=‘learning_logs’)),
]

然后就可以正常运行了,现在打开http://localhost:8000/,就能查看到网页了。