学习Django时遇到的问题笔记

跟着视频开始学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)

提示错误:


context变量必须是一个字典,而不是RequestContext

更改代码如下:

    # 使用模板文件
    # 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__)

执行成功。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容