跟着视频开始学Django,视频里用的是linux环境,由于我的虚拟机有点问题,所以决定在win10下学习。
学习环境:
- windows10
- pycharm
- django3.0
问题一:在terminal输入python manage.py runserver没有反应
没有任何提示,也不提示成功,也不提示错误。
百度说python版本和django版本有冲突,检查了一遍基本没什么问题,后来发现是自己一开始学python的时候不会用pycharm,每次新建project都新建一个python环境,所以进入pycharm把以前用的环境全删了。



最后只留下一个,接着运行python manage.py runserver,终于提示了信息。
二、运行runserver时的utf-8问题
虽然runserver后提示了信息,但是却出现了错误:

百度搜都说在程序里加代码转变格式,但是我寻思我刚装的django怎么可能啥都没写就有这种问题。
然后注意到了这个:

重点在这个hostname,可能是主机名的意思,所以打开电脑属性看了下主机名,里面有中文。
改成英文名之后重启,看看效果。

点进 http://127.0.0.1:8000

ctrl+break退出。
问题三:在根据models生成数据库表时报错 init() missing 1 required positional argument: 'on_delete'
原因:在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错。
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
- CASCADE:此值设置,是级联删除。
- PROTECT:此值设置,是会报完整性错误。
- SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
- SET_DEFAULT:此值设置,会把设置为外键的默认值。
- SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。
代码改成:
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
问题四:Django2.0的版本问题对创建视图的影响
看的视频教程是django1.x版本的,里面建立视图的流程是:
在项目文件夹下的urls.py中加入:
from django.conf.urls import include,url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('booktest.urls')),
]
在应用文件夹下建立urls.py,并写入:
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index', views.index()),
]
在Django3.x版本中导入模块时出错,参考官方文档后,正确的版本如下:
1.在项目文件夹下的urls.py中加入
from django.contrib import admin
from django.urls import path, include
# 项目的urls文件
urlpatterns = [
path('admin/', admin.site.urls),
path('booktest/', include('booktest.urls'))
]
- 导入的包从url换成了path,django.conf.urls也变成了django.urls
- url全部替换成了path,可以不用正则表达式
-
admin.site.urls不再需要include(),官方文档给出了使用include()的时机
2.在应用文件夹下建立urls.py并写入
from django.urls import path
from . import views
urlpatterns = [
# 通过url函数设置url路由配置项
path('', views.index, name='index'), #建立index和视图index之间的关系
]
- 同样是导入包的问题和url与path的问题
- from . import 和 from booktest import 是一回事
之后在终端输入python manage.py runserver检查
注意:runserver后打开127.0.0.1:8000会出现404错误,要输入的是127.0.0.1:8000/booktest(应用名)

问题五:使用模板文件的RequestContext问题
教程里的代码:
# 使用模板文件
# 1.加载模板文件,模板对象
temp = loader.get_template('booktest/index.html')
# 2.定义模板上下文:给我们的模板传递数据
context = RequestContext(request, {''})
# 3.模板渲染:产生标准的html内容
res_html = temp.render(context)
# 4.返回给浏览器
return HttpResponse(res_html)
提示错误:

更改代码如下:
# 使用模板文件
# 1.加载模板文件,模板对象
temp = loader.get_template('booktest/index.html')
# 2.定义模板上下文:给我们的模板传递数据
context = {'temp':temp}
# 3.模板渲染:产生标准的html内容
res_html = temp.render(context)
# 4.返回给浏览器
return HttpResponse(res_html)
成功:

问题六:path不能使用正则匹配表达式
django3版本之后,path替代了url,而且path中只能写绝对路径,不支持正则匹配。
解决办法:使用re_path
问题七:mysqlclient 1.3.13 or newer is required; you have 0.9.3
django默认连接mysqlite,在改成mysql的过程中,安装pymysql并在init.py中加入
import pymysql
pymysql.install_as_MySQLdb()
后运行python manage.py runserver提示mysqlclient 1.3.13 or newer is required; you have 0.9.3
原因:百度了一下怎么说的都有,大概就是django版本和python版本之间的问题
解决办法:
找到Python安装路劲下的Python36-32\Lib\site-packages\django\db\backends\mysql\base.py文件
将文件中的如下代码注释
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
执行成功。
