• Django Web框架的使用


    1.前言

    Django是基于Python的重量级开源Web框架。Django拥有高度定制的ORM和大量的API,简单灵活的视图编写、优雅的url、适用于快速开发的模板以及强大的管理后台。

    Django简介可以查看菜鸟教程

    Django 简介 | 菜鸟教程

    2.使用pip安装Django

    当我们更换镜像源进行pip 安装时,可能会出现报错:ERROR: Cannot determine archive format of :XXXXXXXXXX需要 通过设置 --trusted-host pypi.douban.com 信任该镜像源。

    1. C:\Users\zhangyy>
    2. C:\Users\zhangyy>pip install django==3.2.13 https://mirrors.aliyun.com/pypi/simple/
    3. Collecting https://mirrors.aliyun.com/pypi/simple/
    4. Downloading https://mirrors.aliyun.com/pypi/simple/ (21.0 MB)
    5. ---------------------------------------- 21.0/21.0 MB 8.1 MB/s eta 0:00:00
    6. ERROR: Cannot unpack file C:\Users\zhangyy\AppData\Local\Temp\pip-unpack-ypvyb0uw\simple (downloaded from C:\Users\zhangyy\AppData\Local\Temp\pip-req-build-0wx0y5_x, content-type: text/html; charset=utf-8); cannot detect archive format
    7. ERROR: Cannot determine archive format of C:\Users\zhangyy\AppData\Local\Temp\pip-req-build-0wx0y5_x
    8. C:\Users\zhangyy>pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com Django==4.1.3
    9. Looking in indexes: https://pypi.douban.com/simple
    10. Collecting Django==4.1.3
    11. Downloading https://pypi.doubanio.com/packages/4f/be/cd28514516e66c40b87e487be68cf61a1637bd3ec60a2db90bb5075a2df5/Django-4.1.3-py3-none-any.whl (8.1 MB)
    12. ---------------------------------------- 8.1/8.1 MB 2.5 MB/s eta 0:00:00
    13. Collecting asgiref<4,>=3.5.2
    14. Downloading https://pypi.doubanio.com/packages/af/6d/ea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7/asgiref-3.5.2-py3-none-any.whl (22 kB)
    15. Collecting sqlparse>=0.2.2
    16. Downloading https://pypi.doubanio.com/packages/97/d3/31dd2c3e48fc2060819f4acb0686248250a0f2326356306b38a42e059144/sqlparse-0.4.3-py3-none-any.whl (42 kB)
    17. ---------------------------------------- 42.8/42.8 kB 2.0 MB/s eta 0:00:00
    18. Collecting tzdata
    19. Downloading https://pypi.doubanio.com/packages/61/1e/3c4bf37f8d6ceba07ae357e70eedd21bd15a032b460bab6b12a58c0fce9d/tzdata-2022.6-py2.py3-none-any.whl (338 kB)
    20. ---------------------------------------- 338.8/338.8 kB 7.1 MB/s eta 0:00:00
    21. Installing collected packages: tzdata, sqlparse, asgiref, Django
    22. Successfully installed Django-4.1.3 asgiref-3.5.2 sqlparse-0.4.3 tzdata-2022.6

    现在安装成功了。

    3.创建一个Django项目

    用pycharm创建一个Django项目 

    自动创建的项目中的文件有以下这些:

    manage.py:Django程序执行的入口

    db.sqlite3:SQLite的数据库文件,Django默认使用这种小型数据库存取数据,非必须

    templates:Django生成的HTML模板文件夹,也可以在每个App中使用模板文件夹

    djangoProject:Django生成的和项目同名的配置文件夹

    settings.py:Django总的配置文件,可以配置App、数据库、中间件、模板等诸多选项

    urls.py:Django默认的路由配置文件

    wsgi.py:Django实现的WSGI接口的文件,用来处理Web请求

    运行该项目

    进入pycharm命令行,发现有个报错:

    无法加载文件\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。

    1. 无法加载文件 C:\Users\zhangyy\PycharmProjects\djangoProject\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?Lin
    2. kID=135170 中的 about_Execution_Policies。
    3. + CategoryInfo : SecurityError: (:) [],ParentContainsErrorRecordException
    4. + FullyQualifiedErrorId : UnauthorizedAccess
    5. PS C:\Users\zhangyy\PycharmProjects\djangoProject> get-executionpolicy
    6. Restricted

    打开Windows Powershall在windows以管理员的身份运行,命令窗口输入set-executionpolicy remotesigned,回车,输入Y。

    1. Windows PowerShell
    2. 版权所有(C) Microsoft Corporation。保留所有权利。
    3. 安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows
    4. PS C:\WINDOWS\system32> set-executionpolicy remotesigned
    5. 执行策略更改
    6. 执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170
    7. 中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
    8. [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”): Y
    9. PS C:\WINDOWS\system32>

    检查发现问题解决

    1. PS C:\Users\zhangyy\PycharmProjects\djangoProject> get-executionpolicy
    2. RemoteSigned

    创建完Django项目后,在pycharm的命令行执行一下命令,可以为Django项目生成数据表,并创建一个账户和密码。密码有强密码要求,但是也可以强行不理会。

    1. PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py migrate
    2. Operations to perform:
    3. Apply all migrations: admin, auth, contenttypes, sessions
    4. Running migrations:
    5. Applying contenttypes.0001_initial... OK
    6. Applying auth.0001_initial... OK
    7. Applying admin.0001_initial... OK
    8. Applying admin.0002_logentry_remove_auto_add... OK
    9. Applying admin.0003_logentry_add_action_flag_choices... OK
    10. Applying contenttypes.0002_remove_content_type_name... OK
    11. Applying auth.0002_alter_permission_name_max_length... OK
    12. Applying auth.0003_alter_user_email_max_length... OK
    13. Applying auth.0004_alter_user_username_opts... OK
    14. Applying auth.0005_alter_user_last_login_null... OK
    15. Applying auth.0006_require_contenttypes_0002... OK
    16. Applying auth.0007_alter_validators_add_error_messages... OK
    17. Applying auth.0008_alter_user_username_max_length... OK
    18. Applying auth.0009_alter_user_last_name_max_length... OK
    19. Applying auth.0010_alter_group_name_max_length... OK
    20. Applying auth.0011_update_proxy_permissions... OK
    21. Applying auth.0012_alter_user_first_name_max_length... OK
    22. Applying sessions.0001_initial... OK
    23. PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py createsuperuser
    24. Username (leave blank to use 'zhangyy'): zhangyy
    25. Email address:
    26. Password:
    27. Password (again):
    28. The password is too similar to the username.
    29. This password is too short. It must contain at least 8 characters.
    30. Bypass password validation and create user anyway? [y/N]: y
    31. Superuser created successfully.

    重新启动服务器

    1. C:\Users\zhangyy\PycharmProjects\djangoProject\venv\Scripts\python.exe C:\Users\zhangyy\PycharmProjects\djangoProject\manage.py runserver 8000
    2. Watching for file changes with StatReloader
    3. Performing system checks...
    4. System check identified no issues (0 silenced).
    5. November 06, 2022 - 20:18:36
    6. Django version 4.1.3, using settings 'djangoProject.settings'
    7. Starting development server at http://127.0.0.1:8000/
    8. Quit the server with CTRL-BREAK.

    在浏览器中访问“http://127.0.0.1:8000/admin/”,出现一个后台登录界面的入口。

     使用刚刚创建的账户登录,可以成功登录后台管理界面,如下:

    4.创建APP

    在Django项目中,推荐使用App来完成不同模块的任务,通过在“terminal”执行以下命令来启用一个应用程序

    (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py startapp app1
    

    可以看到App1的目录结构如下

    文件目录说明:

    migrations:执行数据库迁移生成的脚本

    admin.py:配置Django管理后台的文件

    apps.py:单独配置添加的每个App的文件

    models.py:创建数据库数据模型对象的文件

    tests.py:用来编写测试脚本的文件

    views.py:用来编写视图控制器的文件

    最后,将已经创建的App的名字添加到settings.py配置文件中,然后将其激活。

    1. # Application definition
    2. INSTALLED_APPS = [
    3. 'django.contrib.admin',
    4. 'django.contrib.auth',
    5. 'django.contrib.contenttypes',
    6. 'django.contrib.sessions',
    7. 'django.contrib.messages',
    8. 'django.contrib.staticfiles',
    9. 'app1',
    10. ]

    5.数据模型

    5.1 在App中添加数据模型

    在app1的models.py中添加如下代码

    1. from django.db import models # 引入django.db.models模块
    2. class CreateUpdate(models.Model): # 创建抽象数据模型,同样要继承于models.Model
    3. # 创建时间,使用models.DateTimeField
    4. created_at = models.DateTimeField(auto_now_add=True)
    5. # 修改时间,使用models.DateTimeField
    6. updated_at = models.DateTimeField(auto_now=True)
    7. class Meta: # 元数据,除了字段以外的所有属性
    8. # 设置model为抽象类。指定该表不应该在数据库中创建
    9. abstract = True
    10. class Person(CreateUpdate): # 继承CreateUpdate基类
    11. first_name = models.CharField(max_length=30)
    12. last_name = models.CharField(max_length=30)
    13. class Order(CreateUpdate): # 继承CreateUpdate基类
    14. order_id = models.CharField(max_length=30, db_index=True)
    15. order_desc = models.CharField(max_length=120)

    这样,我们用于创建日期和修改日期的数据模型继承于CreateUpdate类。

    1. C:\Users\zhangyy\PycharmProjects\djangoProject\venv\Scripts\python.exe C:\Users\zhangyy\PycharmProjects\djangoProject\manage.py runserver 8000
    2. Performing system checks...
    3. Watching for file changes with StatReloader
    4. System check identified no issues (0 silenced).
    5. November 20, 2022 - 19:58:03
    6. Django version 4.1.3, using settings 'djangoProject.settings'
    7. Starting development server at http://127.0.0.1:8000/
    8. Quit the server with CTRL-BREAK.

    可以总结下Django数据模型中常见的字段类型和说明

    5.2 执行数据库迁移

    创建完数据模型后,开始做数据库迁移,首先我们不希望用Django默认的自带的SQLite数据库,我们想用MySQL数据库,在项目的settings.py配置文件中找到如下配置:

    1. DATABASES = {
    2. 'default': {
    3. 'ENGINE': 'django.db.backends.sqlite3',
    4. 'NAME': BASE_DIR / 'db.sqlite3',
    5. }
    6. }

    替换为

    1. DATABASES = {
    2. 'default': {
    3. 'ENGINE': 'django.db.backends.mysql',
    4. 'NAME': 'demo',
    5. 'USER': 'root',
    6. 'PASSWORD': 'root'
    7. }
    8. }

    创建数据库,在终端连接数据库,执行数据库登录命令并按照提示输入您的数据库密码,连接成功后执行如下语句创建数据库:

    1. (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> mysql -u root -p
    2. Enter password: ****
    3. Welcome to the MySQL monitor. Commands end with ; or \g.
    4. Your MySQL connection id is 12
    5. Server version: 8.0.31 MySQL Community Server - GPL
    6. Copyright (c) 2000, 2022, Oracle and/or its affiliates.
    7. Oracle is a registered trademark of Oracle Corporation and/or its
    8. affiliates. Other names may be trademarks of their respective
    9. owners.
    10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    11. mysql> create database demo default character set utf8;
    12. Query OK, 1 row affected, 1 warning (0.01 sec)
    13. mysql>

    安装数据库的驱动:

    1. (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> pip install pymysql
    2. Collecting pymysql
    3. Using cached PyMySQL-1.0.2-py3-none-any.whl (43 kB)
    4. Installing collected packages: pymysql
    5. Successfully installed pymysql-1.0.2

    找到C:\Users\zhangyy\PycharmProjects\djangoProject\djangoProject文件,在行首添加如下代码,据说可以将pymysql发挥最大的数据库操作性能。

    1. import pymysql
    2. pymysql.install_as_MySQLdb()

    执行以下命令,创建数据表:

    1. (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py makemigrations
    2. Migrations for 'app1':
    3. app1\migrations\0001_initial.py
    4. - Create model Order
    5. - Create model Person
    6. (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py migrate
    7. Operations to perform:
    8. Apply all migrations: admin, app1, auth, contenttypes, sessions
    9. Running migrations:
    10. Applying contenttypes.0001_initial... OK
    11. Applying auth.0001_initial... OK
    12. Applying admin.0001_initial... OK
    13. Applying admin.0002_logentry_remove_auto_add... OK
    14. Applying admin.0003_logentry_add_action_flag_choices... OK
    15. Applying app1.0001_initial... OK
    16. Applying contenttypes.0002_remove_content_type_name... OK
    17. Applying auth.0002_alter_permission_name_max_length... OK
    18. Applying auth.0003_alter_user_email_max_length... OK
    19. Applying auth.0004_alter_user_username_opts... OK
    20. Applying auth.0005_alter_user_last_login_null... OK
    21. Applying auth.0006_require_contenttypes_0002... OK
    22. Applying auth.0007_alter_validators_add_error_messages... OK
    23. Applying auth.0008_alter_user_username_max_length... OK
    24. Applying auth.0009_alter_user_last_name_max_length... OK
    25. Applying auth.0010_alter_group_name_max_length... OK
    26. Applying auth.0011_update_proxy_permissions... OK
    27. Applying auth.0012_alter_user_first_name_max_length... OK
    28. Applying sessions.0001_initial... OK
    29. (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject>

    用navicat连接到数据库,连接参数安装settings.py配置文件填写,可以从数据库查看到创建的这两张表

    其中

    Person类对应app1_person表

    Order类对应app1_order表

    而CreateUpdate是个抽象类,不会创建表结构。

    5.3 了解Django数据API

    可以在Django的交互命令行中执行命令 

    导入数据模型并用两种方式创建数据:

    1. (venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py shell
    2. Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
    3. Type "help", "copyright", "credits" or "license" for more information.
    4. (InteractiveConsole)
    5. >>> from app1.models import Person, Order
    6. >>> p = Person.objects.create(first_name="hong", last_name="zhang")
    7. >>> p = Person(first_name="yy",last_name="zhang")
    8. >>> p.save()
    9. >>>

    检查数据库,数据创建成功:

    查询数据和修改数据:

    1. >>> Person.objects.get(last_name="zhang")
    2. Traceback (most recent call last):
    3. File "", line 1, in
    4. File "D:\Users\zhangyy\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    5. return getattr(self.get_queryset(), name)(*args, **kwargs)
    6. File "D:\Users\zhangyy\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 653, in get
    7. raise self.model.MultipleObjectsReturned(
    8. app1.models.Person.MultipleObjectsReturned: get() returned more than one Person -- it returned 2!
    9. >>> Person.objects.get(first_name="yy")
    10. object (2)>
    11. >>> Person.objects.get(first_name="hong")
    12. object (1)>
    13. >>> p = Person.objects.get(first_name="yy")
    14. >>> p.first_name = "yyy"
    15. >>> p.save()

    也可以使用get_or_create,如果数据存在就修改,不存在就创建:

    1. >>> p, is_created = Person.objects.get_or_create(
    2. ... first_name="yyyy",
    3. ... defaults={"last_name":"zhang"}
    4. ... )
    5. >>>

    数据库连接如下

    6.管理后台

    定义好数据模型后,就可以配置管理后台了,按照如下代码编辑app1下面的admin.py文件:

    1. from django.contrib import admin # 引入admin模块
    2. from app1.models import Person, Order # 引入数据模型类
    3. class PersonAdmin(admin.ModelAdmin):
    4. """
    5. 创建PersonAdmin类,继承于admin.ModelAdmin
    6. """
    7. # 配置展示列表,在Person板块下的列表展示
    8. list_display = ('first_name', 'last_name')
    9. # 配置过滤查询字段,在Person板块下右侧过滤框
    10. list_filter = ('first_name', 'last_name')
    11. # 配置可以搜索的字段,在Person板块下右侧搜索框
    12. search_fields = ('first_name',)
    13. # 配置只读字段展示,设置后该字段不可编辑
    14. readonly_fields = ('created_at', 'updated_at')
    15. # 绑定Person模型到PersonAdmin管理后台
    16. admin.site.register(Person, PersonAdmin)

    点击“run”,在浏览器中访问“http://127.0.0.1:8000/admin/”,效果如图:

    7.路由

    Django 的URL路由流程:

    (1) Django查找全局urlpatterns变量(urls.py)

    (2) 按照先后顺序,对URL逐一匹配urlpatterns每个元素。

    (3) 找到第一个匹配时停止查找,根据匹配结果执行对应的处理函数。

    (4) 如果没有找到匹配或者出现异常,Django进行错误处理。

    Django 支持三种表达形式,分别是:

    (1)精确地字符串格式:articles/2022/。

    (2)Django 的转换格式: <类型:变量名>,articles//。

    (3)正则表达式格式,如“articles/(?p[0-9]{4)/”。

    编写URL的三种情况:

    1.普通URL

    2.顺序传参

    3.关键字传参。

    推荐使用关键字传参。打开项目根目录的配置文件夹下面的urls.py文件,打开文件,添加一行代码如下:

    1. """djangoProject URL Configuration
    2. The `urlpatterns` list routes URLs to views. For more information please see:
    3. https://docs.djangoproject.com/en/4.1/topics/http/urls/
    4. Examples:
    5. Function views
    6. 1. Add an import: from my_app import views
    7. 2. Add a URL to urlpatterns: path('', views.home, name='home')
    8. Class-based views
    9. 1. Add an import: from other_app.views import Home
    10. 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
    11. Including another URLconf
    12. 1. Import the include() function: from django.urls import include, path
    13. 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
    14. """
    15. from django.contrib import admin
    16. from django.urls import path, include
    17. urlpatterns = [
    18. path('admin/', admin.site.urls),
    19. path('app1/', include('app1.urls')) #添加
    20. ]

    然后在app1下面创建一个urls.py文件,并在其中编写属于这个模块的url规则:

    下面用三种方式创建路由。

    1.精确匹配

    app1的urls.py文件:

    1. from app1 import views as app1_views
    2. from django.urls import path
    3. urlpatterns = [
    4. # 精确匹配视图
    5. path('articles/2022/', app1_views.articles),
    6. ]

    其中app1_views是views的别名。

    在app1的views.py添加代码:

    1. from django.shortcuts import render
    2. from django.http import HttpResponse, HttpResponseRedirect
    3. def articles(request):
    4. return HttpResponse("hello world")

    测试

    2. 传入参数

    app1的urls.py文件:

    1. from app1 import views as app1_views
    2. from django.urls import path
    3. urlpatterns = [
    4. # 匹配一个整数
    5. path('article/', app1_views.articles),
    6. ]

    在app1的views.py修改代码:

    1. from django.shortcuts import render
    2. from django.http import HttpResponse, HttpResponseRedirect
    3. def articles(request, year):
    4. content = 'the year is %s' % year
    5. return HttpResponse(content)

    测试

    3. 正则匹配

    app1的urls.py文件:

    1. from django.urls import re_path
    2. from app1 import views as views
    3. from django.urls import path
    4. urlpatterns = [
    5. # 按照正则表达式匹配4位数字年份
    6. re_path(r'^article/(?P[0-9]{4})/$', views.article),
    7. ]

    在app1的views.py代码保持不变

    测试

     若修改app1的urls.py文件为:

    1. from django.urls import re_path
    2. from app1 import views as views
    3. from django.urls import path
    4. urlpatterns = [
    5. # 按照正则表达式匹配4位数字年份和2位数字月份
    6. re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_articles),
    7. views.article_detail),
    8. ]

    在app1的views.py修改代码:

    1. from django.shortcuts import render
    2. from django.http import HttpResponse, HttpResponseRedirect
    3. def month_articles(request, year, month):
    4. content = 'the year is %s , the month is %s' % (year, month)
    5. return HttpResponse(content)

    测试

    8.表单

    在app1文件夹下创建一个forms.py文件,添加如下类代码:

    1. from django import forms
    2. class PersonForm(forms.Form):
    3. first_name = forms.CharField(label='你的名字', max_length=20)
    4. last_name = forms.CharField(label='你的姓氏', max_length=20)

            上面定义了一个PersonForm表单类,两个字段类型为forms.CharField,first_name指字段的label为你的名字,并且指定该字段的最大长度为20字符。max_length可以指定forms.CharField的验证长度。

            表单类forms.Form有一个is_valid()方法,可以在views.py中验证提交的表单是否符合规则。对于提交的内容,在views.py下编写 如下代码:

    1. from django.shortcuts import render
    2. from django.http import HttpResponse, HttpResponseRedirect
    3. from app1.forms import PersonForm
    4. def get_name(request):
    5. # 判断请求方法是否为POST
    6. if request.method == 'POST':
    7. # 将请求数据填充到PersonForm实例中
    8. form = PersonForm(request.POST)
    9. # 判断form是否为有效表单
    10. if form.is_valid():
    11. # 使用form.cleaned_data获取请求的数据
    12. first_name = form.cleaned_data['first_name']
    13. last_name = form.cleaned_data['last_name']
    14. # 响应拼接后的字符串
    15. return HttpResponse(first_name + '' + last_name)
    16. else:
    17. return HttpResponseRedirect('/error/')
    18. # 请求为GET方法
    19. else:
    20. return render(request, 'name.html', {'form': PersonForm()})

    这里有一个html文件的名字。我们要创建这个html文件。

    在app1的同级目录下有个templates目录,在这个目录里新建name.html文件。

    编写name.html文件

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <form action="/app1/get_name" method="post">{% csrf_token %}
    9. {{form}}
    10. <button type="submit">提交button>
    11. form>
    12. body>
    13. html>

    还需要到app1目录下的urls.py的

    urlpatterns = []里面
    

    添加一行

        path('get_name', views.get_name),

    OK, 接下来测试。

    打开

     http://127.0.0.1:8000/app1/get_name 

    可以看到

     

    填写名字,点击提交,效果如图

    这里显示“yyzhang”就是执行了views.py里的这行代码

    return HttpResponse(first_name + '' + last_name)

    9.视图

    9.1基于函数的视图

    django.http模块下有诸多继承于HttpResponse的对象,其中大部分在开发中都可以利用到。例如我们想在查询不到数据时,给客户端返回一个Http 404 的错误页面。可以利用django.http下面的Http404对象,在views.py里编写代码如下:

    1. from django.shortcuts import render
    2. from django.http import HttpResponse, HttpResponseRedirect, Http404
    3. from app1.forms import PersonForm
    4. from app1.models import Person
    5. def person_detail(request, pk): # url参数pk
    6. try:
    7. p = Person.objects.get(pk=pk) # 获取Person数据
    8. except Person.DoesNotExist:
    9. raise Http404('Person Does Not Exist') # 获取不到抛出Http404错误页面
    10. return render(request, 'person_detail.html', {'person': p}) # 返回详细信息视图

    新建一个与name.html文件同级的person_detail.html文件

    编写如下html代码

    1. "en">
    2. "UTF-8">
    3. Title
    4. {{ person.first_name }}

    不要忘了到app1目录下的urls.py的urlpatterns = []里面 添加一行path:

        path('person_detail/', views.person_detail)

    测试结果1:

    测试结果2

     

    测试结果3:

    对照5.3章节的数据库表截图,可知,测试正确

    9.2基于类的视图

    基于类的视图和基于函数的视图大同小异。首先定义一个类视图,这个类视图需要继承一个基础的类视图,所有的类视图都继承自views.View。类视图的初始化参数需要给出。将上一章节定义的get_name()方法改成基于类的视图,修改views.py代码如下:

    1. from django.shortcuts import render
    2. from django.http import HttpResponse, HttpResponseRedirect, Http404
    3. from django.views import View
    4. from app1.forms import PersonForm
    5. from app1.models import Person
    6. class PersonFormView(View):
    7. form_class = PersonForm # 定义表单类
    8. initial = {'key': 'value'} # 定义表单初始化展示参数
    9. template_name = 'name.html' # 定义渲染的模板
    10. def get(self, request, *args, **kwargs): # 定义GET请求的方法
    11. # 渲染表单
    12. return render(request, self.template_name,
    13. {'form': self.form_class(initial=self.initial)})
    14. def post(self, request, *args, **kwargs): # 定义POST请求的方法
    15. form = self.form_class(request.POST) # 填充表单实例
    16. if form.is_valid(): # 判断请求是否有效
    17. # 使用form.cleaned_data获取请求的数据
    18. first_name = form.cleaned_data['first_name']
    19. last_name = form.cleaned_data['last_name']
    20. # 响应拼接后的字符串
    21. return HttpResponse(first_name + '' + last_name) # 返回拼接的字符串
    22. return render(request, self.template_name, {'form': form}) # 如果表单无效,返回表单

    到app1目录下的urls.py的urlpatterns = []里面 添加一行path:

        path('get_name1', views.PersonFormView.as_view()),

    测试

     

    填写名字,点击提交,效果如图

     OK, 基于类的视图也测试成功!

    10.Django模板

    模板语言包括四个内容

     

    下面都是从views.py中修改演示模板

    变量 在之间的例子里已经用过了。

    标签 的使用

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. {{ person.first_name }}
    9. {% if person.first_name == 'hong'%}
    10. hi, hong
    11. {% else %}
    12. hi, 陌生人
    13. {% endif %}
    14. body>
    15. html>

    测试

    过滤器的使用

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. {{ person.first_name }}
    9. {{ person.first_name|upper }}
    10. {% if person.first_name == 'hong'%}
    11. hi, hong
    12. {% else %}
    13. hi, 陌生人
    14. {% endif %}
    15. body>
    16. html>

    测试

    注释的使用

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. {{ person.first_name }}
    9. {{ person.first_name|upper }}
    10. {% if person.first_name == 'hong'%}
    11. hi, hong
    12. {% else %}
    13. hi, 陌生人
    14. {% endif %}
    15. body>
    16. html>

    测试结果

           如果你只是想 将上面HTML里的“陌生人”注释掉,可以将“陌生人”修改为 “{# 陌生人#}”。

    11.最后

            通过这篇博客的学习,不难发现,Django视图编写灵活、URL优雅,有适用于快速开发的模板以及强大的管理后台,这些使得它在python web开发领域占据了不可动摇的地位。

  • 相关阅读:
    Robot Arm 机械臂源码解析
    强化学习-学习笔记14 | 策略梯度中的 Baseline
    Vue常见问题
    电脑录屏快捷键是什么?win10自带屏幕录制在哪
    RocketMQ消息过滤是如何实现的?
    Kafka为什么这么快?
    C语言源代码系列-管理系统之学生选修课程系统
    c#委托的三种实现方式
    LC-895. 最大频率栈(优先队列+哈希表)
    COIG:开源四类中文指令语料库
  • 原文地址:https://blog.csdn.net/qq_33163046/article/details/127719777