Django Web框架的使用

news2024/11/15 13:28:27

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 信任该镜像源。

C:\Users\zhangyy>
C:\Users\zhangyy>pip install django==3.2.13 https://mirrors.aliyun.com/pypi/simple/
Collecting https://mirrors.aliyun.com/pypi/simple/
  Downloading https://mirrors.aliyun.com/pypi/simple/ (21.0 MB)
     ---------------------------------------- 21.0/21.0 MB 8.1 MB/s eta 0:00:00
  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
ERROR: Cannot determine archive format of C:\Users\zhangyy\AppData\Local\Temp\pip-req-build-0wx0y5_x

C:\Users\zhangyy>pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com Django==4.1.3
Looking in indexes: https://pypi.douban.com/simple
Collecting Django==4.1.3
  Downloading https://pypi.doubanio.com/packages/4f/be/cd28514516e66c40b87e487be68cf61a1637bd3ec60a2db90bb5075a2df5/Django-4.1.3-py3-none-any.whl (8.1 MB)
     ---------------------------------------- 8.1/8.1 MB 2.5 MB/s eta 0:00:00
Collecting asgiref<4,>=3.5.2
  Downloading https://pypi.doubanio.com/packages/af/6d/ea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7/asgiref-3.5.2-py3-none-any.whl (22 kB)
Collecting sqlparse>=0.2.2
  Downloading https://pypi.doubanio.com/packages/97/d3/31dd2c3e48fc2060819f4acb0686248250a0f2326356306b38a42e059144/sqlparse-0.4.3-py3-none-any.whl (42 kB)
     ---------------------------------------- 42.8/42.8 kB 2.0 MB/s eta 0:00:00
Collecting tzdata
  Downloading https://pypi.doubanio.com/packages/61/1e/3c4bf37f8d6ceba07ae357e70eedd21bd15a032b460bab6b12a58c0fce9d/tzdata-2022.6-py2.py3-none-any.whl (338 kB)
     ---------------------------------------- 338.8/338.8 kB 7.1 MB/s eta 0:00:00
Installing collected packages: tzdata, sqlparse, asgiref, Django
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,因为在此系统上禁止运行脚本。

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

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

Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。

安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows

PS C:\WINDOWS\system32> set-executionpolicy remotesigned

执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): Y
PS C:\WINDOWS\system32>

检查发现问题解决

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

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

PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py createsuperuser
Username (leave blank to use 'zhangyy'): zhangyy
Email address:
Password:
Password (again):
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

重新启动服务器

C:\Users\zhangyy\PycharmProjects\djangoProject\venv\Scripts\python.exe C:\Users\zhangyy\PycharmProjects\djangoProject\manage.py runserver 8000 
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 06, 2022 - 20:18:36
Django version 4.1.3, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
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配置文件中,然后将其激活。

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
]

5.数据模型

5.1 在App中添加数据模型

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

from django.db import models  # 引入django.db.models模块


class CreateUpdate(models.Model):  # 创建抽象数据模型,同样要继承于models.Model
    # 创建时间,使用models.DateTimeField
    created_at = models.DateTimeField(auto_now_add=True)
    # 修改时间,使用models.DateTimeField
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:  # 元数据,除了字段以外的所有属性
        # 设置model为抽象类。指定该表不应该在数据库中创建
        abstract = True


class Person(CreateUpdate):  # 继承CreateUpdate基类
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


class Order(CreateUpdate):  # 继承CreateUpdate基类
    order_id = models.CharField(max_length=30, db_index=True)
    order_desc = models.CharField(max_length=120)

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

C:\Users\zhangyy\PycharmProjects\djangoProject\venv\Scripts\python.exe C:\Users\zhangyy\PycharmProjects\djangoProject\manage.py runserver 8000 
Performing system checks...

Watching for file changes with StatReloader
System check identified no issues (0 silenced).
November 20, 2022 - 19:58:03
Django version 4.1.3, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

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

5.2 执行数据库迁移

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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

替换为

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo',
        'USER': 'root',
        'PASSWORD': 'root'
    }
}

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

(venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.31 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database demo default character set utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql>

安装数据库的驱动:

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

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

import pymysql
pymysql.install_as_MySQLdb()

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

(venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py makemigrations 
Migrations for 'app1':
  app1\migrations\0001_initial.py
    - Create model Order
    - Create model Person
(venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, app1, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying app1.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
(venv) PS C:\Users\zhangyy\PycharmProjects\djangoProject> 

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

其中

Person类对应app1_person表

Order类对应app1_order表

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

5.3 了解Django数据API

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

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

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

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

查询数据和修改数据:

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

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

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

数据库连接如下

6.管理后台

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

from django.contrib import admin  # 引入admin模块
from app1.models import Person, Order  # 引入数据模型类


class PersonAdmin(admin.ModelAdmin):
    """
    创建PersonAdmin类,继承于admin.ModelAdmin
    """
    #  配置展示列表,在Person板块下的列表展示
    list_display = ('first_name', 'last_name')
    # 配置过滤查询字段,在Person板块下右侧过滤框
    list_filter = ('first_name', 'last_name')
    # 配置可以搜索的字段,在Person板块下右侧搜索框
    search_fields = ('first_name',)
    # 配置只读字段展示,设置后该字段不可编辑
    readonly_fields = ('created_at', 'updated_at')


# 绑定Person模型到PersonAdmin管理后台
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/<int:year>/。

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

编写URL的三种情况:

1.普通URL

2.顺序传参

3.关键字传参。

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

"""djangoProject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls'))  #添加
]

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

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

1.精确匹配

app1的urls.py文件:

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

其中app1_views是views的别名。

在app1的views.py添加代码:

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect


def articles(request):
    return HttpResponse("hello world")

测试

2. 传入参数

app1的urls.py文件:

from app1 import views as app1_views
from django.urls import path
urlpatterns = [
    #  匹配一个整数
    path('article/<int:year>', app1_views.articles),
]

在app1的views.py修改代码:

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect


def articles(request, year):
    content = 'the year is %s' % year
    return HttpResponse(content)

测试

3. 正则匹配

app1的urls.py文件:

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

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

测试

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

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

在app1的views.py修改代码:

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect


def month_articles(request, year, month):
    content = 'the year is %s , the month is %s' % (year, month)
    return HttpResponse(content)

测试

8.表单

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

from django import forms
class PersonForm(forms.Form):
    first_name = forms.CharField(label='你的名字', max_length=20)
    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下编写 如下代码:

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from app1.forms import PersonForm

def get_name(request):
    # 判断请求方法是否为POST
    if request.method == 'POST':
        # 将请求数据填充到PersonForm实例中
        form = PersonForm(request.POST)
        # 判断form是否为有效表单
        if form.is_valid():
            # 使用form.cleaned_data获取请求的数据
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            # 响应拼接后的字符串
            return HttpResponse(first_name + '' + last_name)
        else:
            return HttpResponseRedirect('/error/')
    # 请求为GET方法
    else:
        return render(request, 'name.html', {'form': PersonForm()})

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

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

编写name.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/app1/get_name" method="post">{% csrf_token %}
    {{form}}
    <button type="submit">提交</button>
</form>
</body>
</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里编写代码如下:

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect, Http404
from app1.forms import PersonForm
from app1.models import Person

def person_detail(request, pk):  # url参数pk
    try:
        p = Person.objects.get(pk=pk)  # 获取Person数据
    except Person.DoesNotExist:
        raise Http404('Person Does Not Exist')  # 获取不到抛出Http404错误页面
    return render(request, 'person_detail.html', {'person': p})  # 返回详细信息视图

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

编写如下html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ person.first_name }}
</body>
</html>

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

    path('person_detail/<int:pk>', views.person_detail)

测试结果1:

测试结果2

 

测试结果3:

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

9.2基于类的视图

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

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.views import View
from app1.forms import PersonForm
from app1.models import Person

class PersonFormView(View):
    form_class = PersonForm  # 定义表单类
    initial = {'key': 'value'}  # 定义表单初始化展示参数
    template_name = 'name.html'  # 定义渲染的模板

    def get(self, request, *args, **kwargs):  # 定义GET请求的方法
        # 渲染表单
        return render(request, self.template_name,
                          {'form': self.form_class(initial=self.initial)})

    def post(self, request, *args, **kwargs):  # 定义POST请求的方法
        form = self.form_class(request.POST)  # 填充表单实例
        if form.is_valid():  # 判断请求是否有效
            # 使用form.cleaned_data获取请求的数据
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            # 响应拼接后的字符串
            return HttpResponse(first_name + '' + last_name)  # 返回拼接的字符串
        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中修改演示模板

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

标签 的使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ person.first_name }}

    {% if person.first_name == 'hong'%}
    hi, hong
    {% else %}
    hi, 陌生人
    {% endif %}
</body>
</html>

测试

过滤器的使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ person.first_name }}

    {{ person.first_name|upper }}

    {% if person.first_name == 'hong'%}
    hi, hong
    {% else %}
    hi, 陌生人
    {% endif %}
</body>
</html>

测试

注释的使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ person.first_name }}
    <!--我是注释-->
    {{ person.first_name|upper }}

    {% if person.first_name == 'hong'%}
    hi, hong
    {% else %}
    hi, 陌生人
    {% endif %}
</body>
</html>

测试结果

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

11.最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows更新NVIDIA显卡驱动

笔记本显卡联想拯救者Y70001050Ti 1、首先进入GeForce官网&#xff0c;选择顶部的驱动程序。 2、拉到下面手动搜素驱动程序&#xff0c;有以下6个筛选条件。 3、我的显卡是GTX 1050Ti&#xff0c;所以选择的配置情况如下。这里注意下产品系列选择的一定要是带&#xff08;NoteB…

一款可以协助排查视频是否乱序的软件:BitRecoverFree JPEG Viewer

笔者在做某个嵌入式linux视频项目的过程中&#xff0c;遇到的需求如下&#xff1a;同事在解码进程中将h264解码为RGB数据&#xff0c;发送给Qt进程&#xff0c;我在Qt进程中通过RPC接收RGB图片数据&#xff08;至于为啥不是接收压缩后的h264数据&#xff0c;这是历史遗留问题&a…

虾皮、Lazada怎么选爆款?测评有哪些方法?

对于一个店铺来说&#xff0c;想要让自己店铺获得更多的流量推广&#xff0c;那么打造出爆款是非常重要的&#xff0c;虾皮、Lazada作为跨境平台也是同样如此&#xff0c;下面就来介绍虾皮、Lazada怎么去选爆款? 1、跟卖 以Shopee、Lazada平台选品&#xff0c;直接“抄”同行…

JavaScript开发工具WebStorm入门教程:开始运行WebStorm(一)

WebStorm是一个JavaScript开发工具&#xff0c;用于JavaScript及其相关技术编码&#xff0c;包括TypeScript、React、Vue、Angular、Node.js、HTML和样式表。就像IntelliJ IDEA和其他JetBrains ide一样&#xff0c;WebStorm让您的开发体验更愉快&#xff0c;自动化日常工作&…

SpringBoot集成Spring Data JPA项目实操

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实操 SpringBoot集成Spring Data JPA项目实操 前言 该说的在《SpringBoot集成Mybatis项目实…

HikariCP源码阅读笔记

加入HikariCP的maven依赖 <dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version> </dependency> <dependency><groupId>mysql</groupId><artifactId&g…

[附源码]java毕业设计疫情背景下社区公共卫生服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

10月BIOTREE协助发表文章再创新高,最高影响因子31.373

10月&#xff0c;BIOTREE在代谢组学、蛋白质组学、多组学方向共收录24篇客户文章&#xff0c;总影响因子&#xff1a;183.749&#xff0c;最高影响因子&#xff1a;31.373&#xff0c;IF>5分有19篇&#xff0c;发表杂志有Cell Metabolism、Clinical Immunology、Cell and Bi…

web网页设计期末课程大作业 HTML+CSS+JavaScript重庆火锅(代码质量好)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

5、设计模式之工厂模式

工厂模式5.1 案例引入5.2简单工厂模式5.2.1 简单工厂模式结构5.2.2 实现5.2.3 优缺点分析5.3 工厂方法模式5.3.1 工厂方法模式结构5.3.2 新需求5.3.3 思路5.3.4 实现5.3.5 优缺点分析5.4 抽象工厂5.4.1 介绍5.4.2 结构5.4.3 实现5.4.4 使用场景5.5 工厂配置文件实现解耦相关文章…

【Vue】pc和移动端网页样式适配

在下面环节会讲解怎么做pc和移动端网页样式适配。 在当下有两种实现样式适配的&#xff1a;JS 适配方案和CSS 媒体查询适配。下面会具体讲解一下代码该怎么写。 &#x1f64f; 希望该文章能帮助到你。 1. JS 适配方案 比如在src/router/index.vue文件中有一个统一的Layout组件包…

《机器学习实战》9.树回归

目录 树回归 1 复杂数据的局部性建模 2 连续和离散型特征的树的构建 3 将CART算法用于回归 3.1 构建树 3.2 运行代码 4 树剪枝 4.1 预剪枝 4.2 后剪枝 5 模型树 6 示例&#xff1a;树回归与标准回归的比较 7 使用python的Tkinter库创建GUI 7.1 用Tkinter创建GUI …

UG旋钮盖模具设计与加工

文章目录三维造型设计创建草图旋转拉伸拉伸求差圆周阵列倒圆抽壳二板模模具设计分型面初始化项目定义模具坐标定义成形镶件定义一模四腔的布局创建型芯和型腔检测区域创建区域和分型线创建分型面创建型芯和型腔加载模架创建模架添加标准件添加定位圈添加浇口套添加旋钮盖顶杆修…

【JavaScript】浏览器调试控制台console的功能有了解多少

在我们学会JavaScript编程以后&#xff0c;编程调试通常使用console.log() &#xff0c;那有没有想过&#xff0c;console除了log&#xff0c;还有很多是没有用到的&#xff0c;久而久之&#xff0c;就忘记了怎么用&#xff0c;接下来熟悉一下&#xff0c;温故而知新&#xff0…

网页大作业代码自取

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

Red Eye Camera开发日记之API 移植I2C 和关键接口函数

API 说明文件里面有官方的移植指导&#xff0c;但我觉得可以把重点放在与 MLX90640 具体操作有关的几个函数上&#xff0c;而与标准 I2C 相关的函数和文件结构还是按照自己习惯的套路实现。这样更符合我们开发人员的可控性的习惯。步骤如下&#xff1a; 建立标准 I2C 文件 IIC…

第P9周:YOLOv5-Backbone模块实现

● &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 ● &#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P9周&#xff1a;YOLOv5-Backbone模块实现(训练营内部成员可读) ● &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 说明&…

电脑技巧:推荐4个冷门且功能非常强大的效率工具

目录 1、Seafile 企业云盘神器 2、PPSSPP PSP模拟器神器 3、按键精灵 键盘鼠标模拟神器 4、BenVista PhotoZoom Pro 图片无损放大神器 今天给大家推荐4个冷门且功能非常强大的效率工具&#xff0c;一起来看看吧&#xff01; 1、Seafile 企业云盘神器 Seafile 是一个开源的网…

middlebury立体匹配评估使用方法总结(二)——python版离线教程

系列文章目录 middlebury立体匹配评估使用方法总结&#xff08;一&#xff09;——网站说明 middlebury立体匹配评估使用方法总结&#xff08;二&#xff09;——python版离线教程 文章目录系列文章目录前言1.下载内容2.配置环境3.elas编译4. 运行评估总结前言 最近想使用midd…

vim配置systemverilog环境

参考文章: vim中systemverilog的高亮显示 - 乔_木 - 博客园vim中systemverilog的高亮显示https://www.cnblogs.com/OneFri/p/6087847.html 一、.vimrc配置文件中添加 filetype on "打开文件类型检测 二、创建运行目录 mkdir -p ~/.vim/ftdetect mkdir -p ~/.vim/synta…