准备工作
创建django项目
可以先创建一个虚拟环境(当然,也可以不创建),之后使用如下命令
来创建一个Django项目:
- django-admin startproject 项目名
使用pycharm导入项目
如果我们为项目起的名字是HelloDjango,那么选中这个文件夹导入,接着进入设置,选择对应的(如果创建了虚拟环境,那么就选择虚拟环境的python解释器)解释器。
开始
可以使用如下命令来测试运行结果。
- python manage.py runserver
使用如下命令来创建一个App:
- python manage.py startapp 名字
HelloDjango文件夹下现在应该有如下内容:
- App文件夹(名字是你起的)
- HelloDjango文件夹
- manage.py
- db.sqlite3
子HelloDjango文件夹下的:
-
settings.py是配置文件
-
urls.py是路由,即不同的页面,可以在这里添加path来编写多个页面。
第一个参数是页面名称,第二个参数是页面的位置,在App的views.py中,
在此文件中定义方法来使得在urls.py中新添加的页面有效,这个新的方法
第一个参数必须是request(当然,参数名随意),也必须返回response对象
可以用简单的 HttpResponse(‘2020/6/26’) 来测试一下(当然,这需要我们导入from django.http import HttpResponse头文件)。也可以不使用HttpResponse,而是导入一个模板作为返回对象,见下
-
wsgi.py好像是发布时用的,以后学到再说。
使用模板的两种方式
一
- 在App中新建一个文件夹:template,
- 在template中创建html文件
- 依然是在urls中添加新的path,第二个参数写views.名字
- 在views中定义那个方法,只不过现在返回的是render(request, ‘index.html’),render可以将html文件渲染好返回给urls
- 为了让在views返回templates文件时有提示,需要做如下两件事:
1. 将templates文件夹右键标记目录为template
2. 在settings.py中INSTALLED_APPS这一项中添加’App’
二
- 不在App而是在项目目录,即第一个HelloDjango下创建templates的文件夹(右键标记为template)
- 和第一种方法一样,在urls中添加path,然后在views中写相应方法
- 在settings.py中TEMPLATES下’DIRS’里添加: os.path.join(BASE_DIR, ‘templates’),才行,将这个模板注册进去
!注意! 这里templates一定不要写错,我当时就是没加s导致里面的html文件怎么都加载不出来。
使用多个App
我们之前都是在子HelloDjango文件夹下urls里添加的路由,但是当路由多了的时候很麻烦,因此我们可以用下面的方式:
步骤:
- 在最外层HelloDjango下创建一个新的App,例如Two (python manage.py startapp Two)
- 在Two里面新建一个文件:urls.py
- 文件内容是:urlpatterns = [],在列表里写和之前的urls中相同形式的内容,如:path(‘home/’, views.home),当然,包还是要导入的
- 在Two的views中创建相应的方法并导入包
- 但此时主urls并不知道Two中也有urls,因此在其中添加path(‘Two/’, include((‘Two.urls’, ‘Two’))),
- 别忘了在settings中添加’Two’,
- 访问时,看看我们在主urls是怎么写的,我这里是Two,因此要用127.0.0.1:8000/Two/home来访问Two的urls中的home
访问大致流程
今天主要是了解了大致的模块,并简单熟悉了一下流程。通常来说,views是要访问数据库来拿到数据的,但上面并没有经过DB,只是简单的试验了一下。
与数据库连接
在models中与数据库进行对接,默认使用的是db.sqlite3 models使用ORM技术(Object Relational Mapping, 对象关系映射),这样我们在对数据进行处理时就不用再写之前的insert、select等等,而是直接object.save()、object.delete()就行。
关系型数据库首先要定义数据库(DDL),在Django中,通过models的定义实现数据库表的定义。
创建表
在这个过程中,遇见了如下问题:
将db.sqlite3导入到pycharm自带的数据库时,下面有条红色的波浪线并且数据库也点不开,
后来得知在导入数据时,在界面的左下角有一个download missing 什么玩意,点一下就行了。
- 在models中创建类,然后使用python manage.py makemigrations
- 再输入python manage.py migrate来将你写的类变成表
**注意,makemigrations用来生成迁移文件,可以在migrations文件夹中看到,如果以后想用其他数据库(如mysql),那么就不用执行这句了(因为迁移文件已经生成),直接执行第二句就行了。
类的内容:
class Student(models.Model):
name = models.CharField(max_length=16)
age = models.IntegerField(default=1)
在完成上述步骤后,即可在pycharm中查看数据库并可以对其进行操作。
可以双击表进入弹出的页面来添加/删除数据,但也可以用代码的方法
用代码操作表
添加数据
在urls中添加一条:
- path(‘addstudent/’, views.addstudent),
然后在views中写这个方法:
def addstudent(request):
student = Student()
# student.age = 17
student.name = 'Peter'
student.save()
return HttpResponse('Add Success!')
这时在进入浏览器并输入127.0.0.1:8000/books/addstudent时就会提示添加成功了。
在数据库中也可以看到记录。
遇见的问题:
输入上述地址时,报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
解决方法如下:
找到django/views下debug.py
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open() as fh
将其改成:
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding="utf-8") as fh
输出数据
先介绍一个新东西,在html中也可以用for、if等语句。
html中有形似{{ data }}的结构就说明这是一个“坑”,我们待会要填它。
在哪里填呢?由于我们使用了html文件响应,那么自然要在render()
中填,render的第三个参数是一个字典,里面的key就是上面的data,
那么当程序运行时,会从这个字典中找到data对应的value放到html中。
现在想在浏览器上打印所有学生的信息,怎么办?
- 很显然我们先要在urls中添加path:path(‘get_student/’, views.get_student),并在views中写入对应的方法
- 使用Student.objects.all()返回一个列表,里面存的是所有对象:
def get_student(request):
students = Student.objects.all()
context = {
'students': students
}
return render(request, 'info.html', context=context)
html文件如下:
<ul>
{% for student in students %}
<li>{{ student.name }}</li>
{% endfor %}
</ul>
这里的students作为字典的key,而value则是students(和key同名而已),
在html中,students会被替换成所有学生对象的列表。
现在可以看见所有学生的信息了。
对数据的其他操作
有了上面的知识,更新、删除数据都变得容易了,更新的操作如下:
- 老套路,在urls增加path item,在views中写方法
- 这次用Student.objects.get(pk=2)来得到某个学生对象,这个方法参数是筛选条件。
- 查到对象后,对其属性进行更改,然后save:
def update_student(request):
student = Student.objects.get(pk=2)
student.age = 30
student.save()
return HttpResponse('update success!')
删除同理,不同之处只是:student.delete()