• 使用python进行页面开发——Django模型层


    目录

    一、Django的Model模型介绍

    二、Model的开发流程 

    三、定义Model模型

    四、Model模型的实例

     五、Model模型的查询

    模型查询

    1. 查询集

    2. 字段查询

    六、用户信息管理实例

    1. 创建数据库和表(若是执行表迁移,可跳过下面操作)

    2. 创建项目myweb和应用myapp

    3. 执行数据库连接配置,网站配置

    4. 定义Model类

     5. 实现Web端访问

    继续上面操作完成Web版的Users信息增 删 改 查

    1. 准备模板文件,创建模板目录

    2. 配置路由信息

    3. 编写视图文件:mydemo/myapp/views.py

    4. 编辑浏览信息视图文件:

    5. 编辑添加表单视图文件

    6. 编辑信息表单视图文件

    7. 编辑公共导航栏页视图文件


    一、Django的Model模型介绍

    • 模型是我们项目中的的数据信息源,它包含着储存数据的必要字段和行为。
    • 通常,每个模型对应数据库中的一张表,每个属性对应一个字段
    • 每个模型都是django.db.models.Model的一个Python 子类。(这个model里面封装了我们的增删改查操作)
    • Django 提供一套自动生成的用于数据库访问的API;
    • 模型与数据库的关系是ORM关系(对象-关系-映射)
    • 为什么要用模型?     

                    Model是MVC框架中重要的一部分, 负责在数据库中存取数据   

                    它实现了数据模型与数据库的解耦,即不需要依赖于特定的数据库     

                    通过简单的配置就可以轻松更换数据库

    二、Model的开发流程 

    1. 在models.py中定义模型类,要求继承自models.Model(注意:

      addtime=models.DateTimeField(default=datetime.now)在后面执行迁移文件可能会报错:

      AttributeError: module 'datetime' has no attribute 'now'

      需要改成addtime=models.DateTimeField(default=datetime.datetime.now())

      1. from django.db import models
      2. from datetime import datetime
      3. # Create your models here.
      4. class Users(models.Model):
      5. #id = models.AutoField(primary_key=True) #主键可省略不写
      6. name = models.CharField(max_length=32)
      7. age = models.IntegerField(default=20)
      8. phone = models.CharField(max_length=16)
      9. addtime=models.DateTimeField(default=datetime.now)
      10. #class Meta:
      11. # db_table = "myapp_users" # 指定表名
    2. 把应用加入settings.py文件的installed_app项

    3. 编辑myweb/settings.py文件,并将项目应用文件名添加到该INSTALLED_APPS设置。

      1. INSTALLED_APPS = [
      2. 'django.contrib.admin',
      3. 'django.contrib.auth',
      4. 'django.contrib.contenttypes',
      5. 'django.contrib.sessions',
      6. 'django.contrib.messages',
      7. 'django.contrib.staticfiles',
      8. 'myapp', #或全称:myapp.apps.MyappConfig
      9. ]
    4. 生成迁移文件

      1. python3 manage.py makemigrations
      2. django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No mo
      3. dule named 'MySQLdb'.
      4. Did you install mysqlclient or MySQL-python?
      5. 安装上面"配置Mysql数据库"的第五步配置,或安装:pip install mysqlclient后就可以了
      6. 若执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:
      7. 先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py
      8. 再 python manage.py makemigrations 生成原先的model对应的migration file
    5. 执行迁移

      python3 manage.py migrate
      
    6. 使用模型类进行crud操作

    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. from myapp.models import Users
    4. # Create your views here.
    5. def index(requeest):
    6. #添加操作
    7. ob = Users() #实例化一个新对象(空对象)
    8. ob.name = "张三"
    9. ob.age = 20
    10. ob.phone = '123456789'
    11. ob.save() #新对象就是添加,已存在对象则是修改
    12. #删除操作
    13. mod = Users.objects #获取users的model对象
    14. user = mod.get(id=1) #获取id值为1的数据信息
    15. print(user.name)
    16. user.delete()
    17. #修改操作
    18. ob = Users.objects.get(id=2)
    19. ob.name = "小刘"
    20. ob.age = 26
    21. ob.save()
    22. #数据查询
    23. mod = Users.objects #获取Users模型的model操作对象
    24. ulist = mod.all() #获取所有数据
    25. ulist = mod.filter(name='小刘') #获取name值为小刘的信息
    26. ulist = mod.filter(age=20) #获取所有age=20的信息
    27. ulist = mod.order_by("age") #按age升序排序
    28. ulist = mod.order_by("age")[:2] #按age升序排序,只获取前两条
    29. for u in ulist:
    30. print(u.id,u.name,u.age,u.phone,u.addtime)
    31. return HttpResponse("首页")

    增删改查操作要一条一条的执行, 可以进行注释。

    三、定义Model模型

    • 在模型中定义属性,会生成表中的字段
    • Django根据属性的类型确定以下信息:     

                      1.当前选择的数据库支持字段的类型     

                      2.渲染管理表单时使用的默认html控件     

                      3.在管理站点最低限度的验证

    • Django会为表增加自动增长的主键列,每个模型只能有一个主键列。
    • 属性命名限制     

                     1.不能是Python的保留关键字   

                     2.由于Django的查询方式,不允许使用连续的下划线 

    四、Model模型的实例

    • 模型实例对象是通过objects属性获取,即Django为模型类提供的管理器。

            objects:是Manager类型的对象,用于与数据库进行交互

    • 实例的方法

             __str__(self):重写object方法,此方法在将对象转换成字符串时会被调用  

            save( ):将模型对象保存到数据表中  

            delete( ):将模型对象从数据表中删除 

     五、Model模型的查询

    模型查询

    • 查询集表示从数据库中获取的对象集合
    • 查询集可以含有零个、一个或多个过滤器
    • 过滤器基于所给的参数限制查询的结果
    • 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句
    • 接下来主要讨论如下知识点
      • 查询集
      • 字段查询:比较运算符,F对象,Q对象

    1. 查询集

    • 在管理器上调用过滤器方法会返回查询集
    • 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
    • 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库
    • 何时对查询集求值:迭代,序列化,与if合用
    • 返回查询集的方法,称为过滤器

      • all()  :查询所有数据
      • filter()  :过滤查询
      • exclude()
      • order_by() :排序
      • values():一个对象构成一个字典,然后构成一个列表返回
    • 写法:

      1. filter(键1=值1,键2=值2)
      2. 等价于
      3. filter(键1=值1).filter(键2=值2)
    • 返回单个值的方法

      • get():返回单个满足条件的对象
        • 如果未找到会引发"模型类.DoesNotExist"异常
        • 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
      • count():返回当前查询的总条数
      • first():返回第一个对象
      • last():返回最后一个对象
      • exists():判断查询集中是否有数据,如果有则返回True

    限制查询集

    • 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句

    • 注意:不支持负数索引

    • 使用下标后返回一个新的查询集,不会立即执行查询

    • 如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常

      1. #这会返回前5个对象 LIMIT 5
      2. Entry.objects.all()[:5]
      3. #这将返回第六个到第十个对象 OFFSET 5 LIMIT 5
      4. Entry.objects.all()[5:10]

    查询集的缓存

    • 每个查询集都包含一个缓存来最小化对数据库的访问
    • 在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存的结果

    • 情况一:这构成了两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载

      1. print([e.title for e in Entry.objects.all()])
      2. print([e.title for e in Entry.objects.all()])
    • 情况二:两次循环使用同一个查询集,第二次使用缓存中的数据

      1. querylist=Entry.objects.all()
      2. print([e.title for e in querylist])
      3. print([e.title for e in querylist])
    • 何时查询集不会被缓存:当只对查询集的部分进行求值时会检查缓存,但是如果这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,如果这部分数据已经被缓存,则直接使用缓存中的数据

    2. 字段查询

    • 实现where子名,作为方法filter()、exclude()、get()的参数
    • 语法:属性名称__比较运算符=值
    • 表示两个下划线,左侧是属性名称,右侧是比较类型
    • 对于外键,使用“属性名_id”表示外键的原始值
    • 转义:like语句中使用了%与,匹配数据中的%与,在过滤器中直接写,例如:filter(title__contains="%")=>where title like '%\%%',表示查找标题中包含%的

    比较运算符

    • exact:表示判等,大小写敏感;如果没有写“ 比较运算符”,表示判等

      filter(isDelete=False)
      
    • contains:是否包含,大小写敏感

      exclude(btitle__contains='传')
      
    • startswith、endswith:以value开头或结尾,大小写敏感

      exclude(btitle__endswith='传')
      
    • isnull、isnotnull:是否为null

      filter(btitle__isnull=False)
      
    • 在前面加个i表示不区分大小写,如iexact、icontains、istarswith、iendswith

    • in:是否包含在范围内

      filter(pk__in=[1, 2, 3, 4, 5])
      
    • gt、gte、lt、lte:大于、大于等于、小于、小于等于

      filter(id__gt=3)
      
    • year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算

      1. filter(bpub_date__year=1980)
      2. filter(bpub_date__gt=date(1980, 12, 31))

    跨关联关系的查询:处理join查询

    • 语法:模型类名 <属性名> <比较>

    • 注:可以没有__<比较>部分,表示等于,结果同inner join

    • 可返向使用,即在关联的两个模型中都可以使用

      filter(heroinfo_ _hcontent_ _contains='八')
      

    聚合函数

    • 使用aggregate()函数返回聚合函数的值

    • 函数:Avg,Count,Max,Min,Sum

      1. from django.db.models import Max
      2. maxDate = list.aggregate(Max('bpub_date'))
    • count的一般用法:

      count = list.count()

    六、用户信息管理实例

    1. 创建数据库和表(若是执行表迁移,可跳过下面操作)

    • 进入MySQL数据库创建数据库:mytest
    • 进入数据库创建数据表:myapp_users

      1. CREATE TABLE `myapp_users` (
      2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      3. `name` varchar(32) NOT NULL,
      4. `age` tinyint(3) unsigned NOT NULL DEFAULT '20',
      5. `phone` varchar(16) DEFAULT NULL,
      6. `addtime` datetime(6) NOT NULL,
      7. PRIMARY KEY (`id`)
      8. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    • 添加几条测试数据

    2. 创建项目myweb和应用myapp

    1. # 创建项目框架mydemo
    2. $ django-admin startproject mydemo
    3. $ cd mydemo
    4. # 在项目中创建一个myapp应用
    5. $ python manage.py startapp myapp
    6. # 创建模板目录
    7. $ mkdir templates
    8. $ mkdir templates/myapp
    9. $ cd ..
    10. $ tree myweb
    11. mydemo
    12. ├── mydemo
    13. │ ├── __init__.py
    14. │ ├── settings.py
    15. │ ├── urls.py
    16. │ └── wsgi.py
    17. ├── manage.py
    18. ├── myapp
    19. │ ├── admin.py
    20. │ ├── apps.py
    21. │ ├── __init__.py
    22. │ ├── models.py
    23. │ ├── tests.py
    24. │ └── views.py
    25. └── templates
    26. └── myapp

    3. 执行数据库连接配置,网站配置

    • 编辑myweb/myweb/settings.py文件,配置数据库连接
    1. ...
    2. #配置自己的服务器IP地址
    3. ALLOWED_HOSTS = ['*']
    4. ...
    5. #添加自己应用
    6. INSTALLED_APPS = [
    7. 'django.contrib.admin',
    8. 'django.contrib.auth',
    9. 'django.contrib.contenttypes',
    10. 'django.contrib.sessions',
    11. 'django.contrib.messages',
    12. 'django.contrib.staticfiles',
    13. 'myapp',
    14. #或'myapp.apps.MyappConfig', #或者直接写 myapp
    15. ]
    16. ...
    17. # 配置模板路径信息
    18. TEMPLATES = [
    19. {
    20. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
    21. 'DIRS': [os.path.join(BASE_DIR,'templates')],
    22. 'APP_DIRS': True,
    23. 'OPTIONS': {
    24. 'context_processors': [
    25. 'django.template.context_processors.debug',
    26. 'django.template.context_processors.request',
    27. 'django.contrib.auth.context_processors.auth',
    28. 'django.contrib.messages.context_processors.messages',
    29. ],
    30. },
    31. },
    32. ]
    33. ...
    34. # 数据库连接配置
    35. DATABASES = {
    36. 'default': {
    37. 'ENGINE': 'django.db.backends.mysql',
    38. 'NAME': 'mytest',
    39. 'USER': 'root',
    40. 'PASSWORD': '',
    41. 'HOST': 'localhost',
    42. 'PORT': '3306',
    43. }
    44. }

    4. 定义Model类

    4.1 编辑mydemo/myapp/models.py

    1. from django.db import models
    2. class Users(models.Model):
    3. #id = models.AutoField(primary_key=True) #主键可省略不写
    4. name = models.CharField(max_length=32)
    5. age = models.IntegerField(default=20)
    6. phone = models.CharField(max_length=16)
    7. addtime=models.DateTimeField(default=datetime.now)
    8. def __str__(self):
    9. return self.name+":"+self.phone
    10. # 自定义对应的表名,默认表名:myapp_users
    11. #class Meta:
    12. # db_table="myapp_users"

    如果出现报错:

    AttributeError: module 'datetime' has no attribute 'now'

    需要改成addtime=models.DateTimeField(default=datetime.datetime.now())

     

    4.2 测试Model类的使用

    在项目根目录下执行命令: python manage.py shell

    1. [root@localhost mydemo]# ls
    2. mydemo manage.py myapp
    3. [root@localhost mydemo]# python3 manage.py shell
    4. Python 3.6.1 (default, Jul 18 2017, 01:35:19)
    5. [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
    6. Type "help", "copyright", "credits" or "license" for more information.
    7. (InteractiveConsole)
    8. >>> from myapp.models import Users
    9. >>> Users.objects.all()
    10. 12345678901>, 13456789023>]>
    11. >>> s = Users.objects.get(id=1)
    12. >>> s.id
    13. 1
    14. >>> s.name
    15. '张三'
    16. >>> s.age
    17. 20
    18. >>> s.phone
    19. '12345678901'
    20. >>>

     5. 实现Web端访问

    5.1 编辑mydemo/mydemo/settings.py文件.做 ALLOWED_HOSTS 主机访问配置(若第三步已做可跳过此步骤)

    1. #此处添加自己的IP地址
    2. ALLOWED_HOSTS = ['*']

    5.2 编写项目主路由urls配置,配置对myapp应用路由的访问连接配置

    1. from django.contrib import admin
    2. from django.urls import include,path
    3. urlpatterns = [
    4. #path('admin/', admin.site.urls),
    5. path('', include('myapp.urls')),
    6. ]

    5.3 配置当前应用myapp的路由配置

    在myapp应用目录下创建一个路由文件urls.py文件,注意此文件编码为utf-8(建议复制一个)。

    编辑应用中的路由配置文件:mydemo/myapp/urls.py, 内容如下:

    1. from django.urls import path
    2. from . import views
    3. urlpatterns = [
    4. path('', views.index, name='index'),
    5. ]

    5.4 编辑视图文件:mydemo/myapp/views.py,内容如下

    1. #from django.shortcuts import render
    2. from django.http import HttpResponse
    3. from myapp.models import Users
    4. def index(request):
    5. try:
    6. s = Users.objects.get(id=1)
    7. return HttpResponse(s)
    8. except:
    9. return HttpResponse("没有找到对应的信息!")

    5.5 测试

    项目根目录下运行 pythons manage.py sunserver 0.0.0.0:8000 命令,开启服务:

    1. [root@localhost mydemo]# python manage.py runserver 0.0.0.0:8000
    2. Performing system checks...
    3. System check identified no issues (0 silenced).
    4. July 28, 2020 - 14:01:52
    5. Django version 2.2.11, using settings 'myweb.settings'
    6. Starting development server at http://0.0.0.0:8000/
    7. Quit the server with CONTROL-C.

    打开浏览器,在浏览其中输入网址测试:http://172.16.142.129:8000

    显示结果:张三:12345678901

     

    继续上面操作完成Web版的Users信息增 删 改 查

    1. 准备模板文件,创建模板目录

    1. 在项目目录下创建templates模板目录
    2. 进入模板目录templates,在模板目录下创建应用名myapp的目录
    3. 进入myapp目录,在里面创建一个users目录
    4. 进入users目录,在里面创建文件:index.html,add.html,edit.html,menu.html,info.html

    5 设置模板目录信息:编辑mydemo/mydemo/settings.py文件(若第三步已做可跳过此步骤)

    1. ...
    2. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
    3. 'DIRS': [os.path.join(BASE_DIR,'templates'),],
    4. 'APP_DIRS': True,
    5. ...

    2. 配置路由信息

    打开文件:mydemo/myapp/urls.py路由文件,加入六条路由配置信息

    1. from django.urls import path
    2. from . import views
    3. urlpatterns = [
    4. path('', views.index, name="index"),
    5. path('users', views.indexUsers, name="users"), #浏览用户信息
    6. path('users/add', views.addUsers, name="addusers"), #加载添加用户信息表单
    7. path('users/insert', views.insertUsers, name="insertusers"), #执行用户信息添加
    8. path('users//del', views.delUsers, name="delusers"), #执行用户信息删除
    9. path('users//edit', views.editUsers, name="editusers"), #加载用户信息编辑表单
    10. path('users/update', views.updateUsers, name="updateusers"), #执行用户信息编辑
    11. ]

    3. 编写视图文件:mydemo/myapp/views.py

    1. # 注意:需导入from django.shortcuts import render
    2. from django.shortcuts import render
    3. from django.http import HttpResponse
    4. from myapp.models import Users
    5. def index(request):
    6. try:
    7. list = Users.objects.filter(id__in=[1,3,5])
    8. s = ','.join([vo.name for vo in list])
    9. #修改(将id值为5的age值改为30)
    10. #ob = Users.objects.get(id=5)
    11. #ob.age = 30
    12. #ob.save()
    13. #删除(删除id为3的信息)
    14. #ob = Users.objects.get(id=3)
    15. #ob.delete()
    16. return HttpResponse(s)
    17. except:
    18. return HttpResponse("没有找到对应的信息!")
    19. # 浏览用户信息
    20. def indexUsers(request):
    21. # 执行数据查询,并放置到模板中
    22. list = Users.objects.all()
    23. context = {"stulist":list}
    24. return render(request,"myapp/users/index.html",context)
    25. # 加载添加信息表单
    26. def addUsers(request):
    27. return render(request,"myapp/users/add.html")
    28. # 执行信息添加操作
    29. def insertUsers(request):
    30. try:
    31. ob = Users()
    32. ob.name = request.POST['name']
    33. ob.age = request.POST['age']
    34. ob.phone = request.POST['phone']
    35. ob.save()
    36. context = {'info':'添加成功!'}
    37. except:
    38. context = {'info':'添加失败!'}
    39. return render(request,"myapp/users/info.html",context)
    40. # 执行信息删除操作
    41. def delUsers(request,uid):
    42. try:
    43. ob = Users.objects.get(id=uid)
    44. ob.delete()
    45. context = {'info':'删除成功!'}
    46. except:
    47. context = {'info':'删除失败!'}
    48. return render(request,"myapp/users/info.html",context)
    49. # 加载信息编辑表单
    50. def editUsers(request,uid):
    51. try:
    52. ob = Users.objects.get(id=uid)
    53. context = {'user':ob}
    54. return render(request,"myapp/users/edit.html",context)
    55. except:
    56. context = {'info':'没有找到要修改的信息!'}
    57. return render(request,"myapp/users/info.html",context)
    58. # 执行信息编辑操作
    59. def updateUsers(request):
    60. try:
    61. ob = Users.objects.get(id= request.POST['id'])
    62. ob.name = request.POST['name']
    63. ob.age = request.POST['age']
    64. ob.phone = request.POST['phone']
    65. #ob.addtime = datetime.now
    66. ob.save()
    67. context = {'info':'修改成功!'}
    68. except:
    69. context = {'info':'修改失败!'}
    70. return render(request,"myapp/users/info.html",context)

    4. 编辑浏览信息视图文件:

    文件位置:mydemo/templates/myapp/users/index.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8"/>
    5. <title>用户信息管理title>
    6. <script>
    7. //自定义执行信息删除提示判断,参数uu是成功的删除url地址
    8. function doDel(uu){
    9. if(confirm("确定要删除吗?")){
    10. //网页跳转
    11. window.location=uu;
    12. }
    13. }
    14. script>
    15. head>
    16. <body>
    17. <center>
    18. {% include 'myapp/users/menu.html' %}
    19. <h3>浏览用户信息h3>
    20. <table width="800" border="1">
    21. <tr>
    22. <th>id号th>
    23. <th>姓名th>
    24. <th>年龄th>
    25. <th>电话th>
    26. <th>添加时间th>
    27. <th>操作th>
    28. tr>
    29. {% for stu in stulist %}
    30. <tr>
    31. <td>{{ stu.id }}td>
    32. <td>{{ stu.name }}td>
    33. <td>{{ stu.age }}td>
    34. <td>{{ stu.phone }}td>
    35. <td>{{ stu.addtime|date:'Y-m-d H:i:s' }}td>
    36. <td>
    37. <a href="{% url 'editusers' stu.id %}">编辑a>
    38. <a href="javascript:doDel('{% url 'delusers' stu.id %}');">删除a>
    39. td>
    40. tr>
    41. {% endfor %}
    42. table>
    43. center>
    44. body>
    45. html>

    5. 编辑添加表单视图文件

    文件位置:mydemo/templates/myapp/users/add.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8"/>
    5. <title>用户信息管理title>
    6. head>
    7. <body>
    8. <center>
    9. {% include "myapp/users/menu.html" %}
    10. <h3>添加用户信息h3>
    11. <form action="{% url 'insertusers' %}" method="post">
    12. {% csrf_token %}
    13. <table width="280" border="0">
    14. <tr>
    15. <td>姓名:td>
    16. <td><input type="text" name="name"/>td>
    17. tr>
    18. <tr>
    19. <td>年龄:td>
    20. <td><input type="text" name="age"/>td>
    21. tr>
    22. <tr>
    23. <td>电话:td>
    24. <td><input type="text" name="phone"/>td>
    25. tr>
    26. <tr>
    27. <td colspan="2" align="center">
    28. <input type="submit" value="添加"/>
    29. <input type="reset" value="重置"/>
    30. td>
    31. tr>
    32. table>
    33. form>
    34. center>
    35. body>
    36. html>

    6. 编辑信息表单视图文件

    文件位置:mydemo/templates/myapp/users/edit.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8"/>
    5. <title>用户信息管理title>
    6. head>
    7. <body>
    8. <center>
    9. {% include "myapp/users/menu.html" %}
    10. <h3>修改用户信息h3>
    11. <form action="{% url 'updateusers' %}" method="post">
    12. <input type="hidden" name="id" value="{{ user.id}}"/>
    13. {% csrf_token %}
    14. <table width="280" border="0">
    15. <tr>
    16. <td>姓名:td>
    17. <td><input type="text" name="name" value="{{ user.name }}"/>td>
    18. tr>
    19. <tr>
    20. <td>年龄:td>
    21. <td><input type="text" name="age" value="{{ user.age }}"/>td>
    22. tr>
    23. <tr>
    24. <td>电话:td>
    25. <td><input type="text" name="phone" value="{{ user.phone }}"/>td>
    26. tr>
    27. <tr>
    28. <td colspan="2" align="center">
    29. <input type="submit" value="编辑"/>
    30. <input type="reset" value="重置"/>
    31. td>
    32. tr>
    33. table>
    34. form>
    35. center>
    36. body>
    37. html>

    7. 编辑公共导航栏页视图文件

    文件位置:mydemo/templates/myapp/users/menu.html

    1. <h2>用户信息管理h2>
    2. <a href="{% url 'users' %}">浏览用户a> |
    3. <a href="{% url 'addusers' %}">添加用户a>
    4. <hr/>

    文件位置:mydemo/templates/myapp/users/info.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8"/>
    5. <title>用户信息管理title>
    6. head>
    7. <body>
    8. <center>
    9. {% include "myapp/users/menu.html" %}
    10. <h3>{{ info }}h3>
    11. center>
    12. body>
    13. html>

  • 相关阅读:
    关于组织开展2022年南京市创新产品(第一批)申报工作的通知
    Android~RxJava实现newSingleThreadExecutor()同等效果
    open62541开发:添加sqlite3 历史数据库
    Linux 执行脚本出现 $‘\r‘: command not found 解决方法
    NodeJS 实战系列:DevOps 尚未解决的问题
    YOLOv8改进 | 注意力机制 | 在主干网络中添加MHSA模块【原理+附完整代码】
    HTTP HTTPS SSL TLS
    RabbitMQ之Direct(直连)Exchange解读
    如何进行日期和时间的计算和操作?
    SpringBoot下的代理注解
  • 原文地址:https://blog.csdn.net/weixin_63994459/article/details/125967897