Django的基本使用

    xiaoxiao2024-11-09  64

    Django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作

    ORM的作用就是根据设计的类生产数据库的表,并且数据库的表进行操作。


    1.模型_模型类设计和表生成

    1.在应用文件夹models.py中创建图书类

    from django.db import models # Create your models here. # 图书类(必须要继承modls) class BookInfo(models.Model): '''图书模型类''' # 图书名称,charField说明是一个字符窜,max_length指定字符窜的最大长度 btitle = models.CharField(max_length=20) # 出版日期,DateField说明是一个日期类型 bpub_date = models.DateField() def __str__(self): # 返回书名 return self.btitle

    2.生成迁移文件

    python manage.py makemigrations

    3.执行迁移生成表(根据迁移文件生成表)

    python manage.py migrate

    4.Django默认的数据库是sqliteman,查看需要安装

    https://blog.csdn.net/dyxcome/article/details/85240232

    # 安装 sudo apt-get install sqliteman # 如无法安装,解决方法,编辑源文件 sudo vi /etc/apt/sources.list # 添加源 deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse # 再更新软件列表 sudo apt-get update # 启动 sqliteman

     


    2.通过模型类操作数据表

    5.进入项目shell命令

    python manage.py shell from booktest.models import BookInfo from datetime import date # 增 b1 = BookInfo() b1.btitle = '天龙八部' b1.bpub_date=date(1990,1,1) b1.save() # 查 b2 = BookInfo.objects.get(id=1) b2.btitle >>>'天龙八部' b2.bpub_date >>>datetime.date(1990, 1, 1) # 改 b2.bpub_date=date(1989,10,10) b2.save() # 删 b2.delete() >>>(1, {'booktest.HeroInfo': 0, 'booktest.BookInfo': 1})

    3.模型类关系和关系查询

    6.在models.py创建英雄人物类

    class HeroInfo(models.Model): '''英雄人物类''' # 字符窜 hname = models.CharField(max_length=20) # 布尔 hgender = models.BooleanField(default=False) # 备注 hcomment = models.CharField(max_length=128) # 外键 # 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项, # 此参数为了避免两个表里的数据不一致问题,不然会报错: # TypeError: init() missing 1 required positional argument: ‘on_delete’ # 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: # TypeError: init() missing 1 required positional argument: ‘on_delete’ # 举例说明: # user=models.OneToOneField(User) # owner=models.ForeignKey(UserProfile) # 需要改成: # user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值 # owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值 # 参数说明: # 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) def __str__(self): return self.hname

    7.重新生成迁移文件和数据表

    python manage.py makemigrations python manage.py migrate

     

    8.插入数据

    from .booktest.models import * from datetime import date # 创建书类 b = BookInfo() b.btitle='天龙八部' b.bpub_date=date(1990,1,1) b.save() # 创建英雄类 h=HeroInfo() h.hname='段誉' h.hgender=False h.hcomment='六脉神剑' h.hbook=b h.save() # 如果中途退出,可重新定义 b = BookInfo.objects.get(id=4) # 创建英雄实例 def hero(name,gender,comment,book): h=HeroInfo() h.hname=name h.hgender=gender h.hcomment=comment h.hbook=book h.save() hero('乔峰',False,'降龙十八掌',b) hero('段誉',False,'六脉神剑',b) hero('虚竹',False,'天山折梅手',b) # 查询对象属性 h3 = HeroInfo.objects.get(id=1) h3.hname # 查询一类中所有多类信息 b.heroinfo_set.all() # 查询图书表中所有内容 BookInfo.objects.all() HeroInfo.objects.all()

    4.后台管理

    1.本地化,修改setting.py语言和市区

    # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai'

    2.创建管理员(终端)

    python manage.py createsuperuser

    3.启动服务

    python manage.py runserver

    4.打开本地浏览器,输入登录密码

    http://127.0.0.1:8000/admin/

    5.在应用下的admin.py中注册模型类,告诉Django框架更加注册的模型类来生成对应的表管理页面

    注册显示的表

    from django.contrib import admin from .models import BookInfo,HeroInfo # 注册模型类到后台 # 控制在后台显示哪些表 admin.site.register(BookInfo) admin.site.register(HeroInfo)

    注册显示的字段

    from django.contrib import admin from .models import BookInfo,HeroInfo # Register your models here. # 自定义模型管理类 class BookInfoAdmin(admin.ModelAdmin): '''控制在后台宣示什么字段''' list_display = ['id','btitle','bpub_date'] class HeroInfoAdmin(admin.ModelAdmin): '''控制在后台宣示什么字段''' list_display = ['id','hname','hgender','hcomment','hbook'] # 注册模型类到后台 # 控制在后台显示哪些表 admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo,HeroInfoAdmin)


    5.视图函数的使用

    1.视图函数定义在views.py中

    from django.shortcuts import render from django.http import HttpResponse # Create your views here. # http://127.0.0.1:8000/index def index(request): # 进行处理,和M/T进行交互 return HttpResponse('首页') def book1(request): return HttpResponse('天龙八部') def book2(request): return HttpResponse('倚天屠龙记')

    2.进行url配置,建立url地址和视图的对应关系

    在booktest应用文件夹中创建urls.py文件,并输入

    booktest/urls.py(应用中的urls.py)

    from django.urls import path,include,re_path from . import views # 严格匹配开头和结尾 urlpatterns = [ # 通过url函数设置url路由配置项 # 首页 path('',views.index), # 分页 re_path(r'^book1',views.book1), # 建立和视图index之间的关系 re_path(r'^book2',views.book2), ]

    django_01/urls.py(项目的urls.py)

    from django.contrib import admin from django.urls import path,include,re_path # 项目的url文件 urlpatterns = [ path('admin/', admin.site.urls), # 配置项目 # 首页 re_path('',include("booktest.urls")), # 包含booktest下的url.py文件 # 分页 re_path('^book.*',include("booktest.urls")), # 包含booktest下的url.py文件 ]


    6.模板使用

    1.创建模板文件夹templates,并在其下创建一个与booktest应用对应的模板文件夹

    2.在django_01/setting.py中设置模板路径

    'DIRS': [os.path.join(BASE_DIR,'templates')],

    3.创建templates/booktest中创建html模型文件

    4.在应用文件夹的views.py中调用html,(重点理解调用的原理)

    from django.shortcuts import render from django.http import HttpResponse from django.template import loader # Create your views here. # render原理 def my_render(template_path,context_dict={}): '''使用模板文件''' # # 加载模板文件,返回模板对象 tempObject = loader.get_template(template_path) # # 定义模板上下文,给模板文件传递数据,传递的是键值对 context = context_dict # # 模板渲染,产生标准的html内容 result_html = tempObject.render(context) # # 返回html return HttpResponse(result_html) # http://127.0.0.1:8000/index def index(request): # 进行处理,和M/T进行交互 # return HttpResponse('首页') return my_render('booktest/index.html')

    5.调用框架内置的render函数便能实现my_render函数的功能

    # http://127.0.0.1:8000/index def index(request): # 进行处理,和M/T进行交互 # return HttpResponse('首页') # return my_render('booktest/index.html') return render(request,'booktest/index.html')

    6.在views.py中传入数据content和list

    # http://127.0.0.1:8000/index def index(request): # 进行处理,和M/T进行交互 # return HttpResponse('首页') # return my_render('booktest/index.html') return render(request,'booktest/index.html', {'content':'hello world', 'list':list(range(1,10),)})

    7.在html中写入对应的变量content和list

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板文件</title> </head> <body> <h1>This is a model file.</h1> <br>使用模板变量:<br/> <br>{{content}}<br/> <br>使用列表:<br/> <br>{{ list }}<br/> <br>----<br/> <br>for循环<br/> <ul> {% for i in list%} <li>{{i}}</li> {%endfor%} </ul> </body> </html>

    综合运用

    1创建templates/booktest/show_books.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>显示书名</title> </head> <body> <p>图书信息如下:</p> <ul> {% for i in books %} <li> # 返回链接路由 <a href="/books/{{i.id}}">{{i.btitle}}</a> </li> {% endfor %} </ul> </body> </html>

    2.创建templates/booktest/detail.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>显示人物信息</title> </head> <body> <h1>{{book.btitle}}</h1> 英雄信息如下:<br> <ul> {%for i in heros%} <li>{{i.hname}}---{{i.hcomment}}</li> {% empty %} <li>没有英雄信息</li> {%endfor%} </ul> </body> </html>

    3.修改应用路由booktest/urls.py

    from django.urls import path,include,re_path from . import views # 严格匹配开头和结尾 urlpatterns = [ # 通过url函数设置url路由配置项 # 首页 path('',views.index), # 分页 re_path(r'^book1$',views.book1), # 建立和视图index之间的关系 re_path(r'^book2$',views.book2), re_path(r'^books$',views.show_books), re_path(r'^books/(\d+)$',views.detail), ]

    4.修改应用视图booktest/views.py

    from django.shortcuts import render from django.http import HttpResponse from django.template import loader from .models import BookInfo # Create your views here. # render原理 def my_render(template_path,context_dict={}): '''使用模板文件''' # # 加载模板文件,返回模板对象 tempObject = loader.get_template(template_path) # # 定义模板上下文,给模板文件传递数据,传递的是键值对 context = context_dict # # 模板渲染,产生标准的html内容 result_html = tempObject.render(context) # # 返回html return HttpResponse(result_html) # http://127.0.0.1:8000/index def index(request): # 进行处理,和M/T进行交互 # return HttpResponse('首页') # return my_render('booktest/index.html') return render(request,'booktest/index.html', {'content':'hello world', 'list':list(range(1,10),)}) # 由路由引导到此函数,通过M模型查询数据,返回html页面 def show_books(request): # 通过M查找图书表中的数据 books = BookInfo.objects.all() # 使用模板 return render(request,'booktest/show_books.html', {'books':books}) # 由正则路由传递数据到此函数,通过M模型查询数据,返回html页面 def detail(request,bid): '''查询图书类的关联英雄信息''' # 根据id查询图书信息 book = BookInfo.objects.get(id=bid) # 查询和book关联的英雄信息 heros = book.heroinfo_set.all() # 把数据传递给模板 return render(request, 'booktest/detail.html', {'book':book,'heros': heros}) def book1(request): return HttpResponse('天龙八部') def book2(request): return HttpResponse('倚天屠龙记')

     

    最新回复(0)