Django的基本使用

1、ORM框架

Object:对象-类      Mapping:映射      Relations:关系,关系数据库中的表

 

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

 -->设计类:模型类      ORM另外一个作用:根据设计的类生成数据库中的表

 

启动一个Django:

django-admin.py startproject test1

python manage.py startapp booktest

 

2、模型类设计和表生成

设计类:

模型类-->模型类设计;模型类生成表;通过模型类操作数据表

模型类,在models.py中,要继承models.Model

1 class BookInfo(models.Model):
2     btitle = models.CharField(max_length=20)
3     bpub_date = models.DateField()

Django默认生成id主键

类-->数据库表

生成迁移文件:python manage.py makemigrations  迁移文件是根据模型类生成的 -->把定义的模型类中的属性拿出来放到迁移文件中

执行迁移生成表:python manage.py migrate  根据迁移文件生成表,生成表的默认格式:应用名_模型类名小写

ORM另外一个作用:根据设计的类生成数据库中的表

 

3、通过模型类操作数据表

终端命令:

python manage.py shell

from booktest.models import Bookinfo  #导入类

from datetime import date

b = Bookinfo()  #创建类的对象

b.btitle = '名字'  #实例属性的名字与模型类中的名字是一样的

b.bpub_date = date(1990,1,1)

b.save()  #将对象中保存的数据插入数据表

----->反射机制?!

b2 = BookInfo.objects.get(id=1)  #类名.objects.get()  -->返回一个BookInfo类的实例

b2.btitle  #查询

b2.bpub_date

b2.bpub_date = date(1990, 10, 10)  #更新

b2.save()

b2.delete()

 

4、模型类关系和关系查询

关系属性:建类两个类之间的一对多关系

表的一对多关系,在多表中定义关系属性  hbook = models.ForeignKey('类名')-->对应  hbook_id

新版本添加外键:

from booktest.models import BookInfo, HeroInfo

b.btitle = ' a '

from datetime import date

b.bpub_date = date(1990, 1, 1)

b.save()

h = HeroInfo()

h.name = ' '

h.hgender = ' '  

h.hcomment = ' ' 

h.hbook = b  #赋值为关联的模型类的对象

h.save()

 

b.heroinfo_set.all()  #返回一个列表,内容为该类对应的类的对象  通过book类查询跟该book关联的hero对象

h.book #返回hero关联的book类对象

查询图书表里面的所有内容

BookInfo.objects.all()

HeroInfo.objects.all()

 

5、后台管理 --> 对应admin.py文件,很快生成表对应的后台管理页面-->帮助管理数据库中的表

1)本地化  语言和时区的本地化;修改settings.py文件

2)创建管理员  python manage.py createsuperuser

3)注册模型类  在应用下的admin.py中注册模型类;告诉Django框架根据注册的模型类来生成对应表管理页面

1 from django.contrib import admin  #admin.py
2 from bookest.models import BookInfo
3 admin.site.register(BookInfo)
1 #models.py
2 class BookInfo(models.Model):
3     #......
4     def __str__(self): #改变后台管理页面显示内容,可对其进行相应操作
5         return self.btitle

4)自定义管理页面 自定义模型管理类,模型管理类就是告诉django在生成的管理页面上显示哪些内容

1 #admin.py
2 #自定义模型管理类,控制后台管理页面显示哪些内容
3 class BookInfoAdmin(admin.ModelAdmin):
4     '''图书模型管理类'''
5     list_display = ['id', 'btitle', 'bpub_date']
6 #注册模型类
7 admin.site.register(BookInfo, BookInfoAdmin)

 

6、视图

在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容

1.定义视图函数

视图函数定义在views.py中

视图函数必须有一个参数request(是一个HttpRequest类的对象),进行处理之后,需要返回一个HttpResponse的类对象,HttpResponse对象的参数就是返回给浏览器显示的内容

 1 # views.py
 2 from django.http import HttpResponse
 3 # 1.定义视图函数,HttpRequest
 4 # 2.进行url配置,建立url和视图的对应关系-->urls.py  urlpatterns
 5 def index(request):
 6     # 进行处理,和M、T进行交互
 7     return HttpResponse(' ')
 8 
 9 
10 #urls.py应用的
#要严格匹配开头和结尾,避免匹配错误 11 from django.conf.urls import url 12 from booktest import views 13 urlpatterns = [ 14 # 通过url函数设置url路由配置项 15 url(r'^index$', views.index), #建立/index和视图index的对应关系 16 ] 17 18 19 #urls.py项目的 20 from django.conf.urls import include, url 21 from django.contrib import admin 22 urlpatterns = [ 23 url(r'^admin/', include(admin.site.urls)), 24 url(r'^', include('booktest.urls')) , #包含应用中的urls文件 25 ]

2.进行url配置 -->建立地址和处理函数之间的对应关系

所有的url都在urlpatterns中                    

urls的匹配过程:先去项目的urls.py中匹配,匹配成功执行后面的;然后去应用的urls中匹配;找到视图后,由django调用,返回给浏览器显示

url函数有两个参数,第一个参数是一个正则表达式,第二个是对应的处理动作

配置url时有两种语法格式:

url(正则表达式,视图函数名) -->视图函数

url(正则表达式,include(应用中的urls文件))  -->包含,在这一步会把已经匹配的字符去掉,再去应用的urls文件中查找

 

7、模板-->在视图中返回一个html文件

模板不仅仅是一个html文件

模板文件的使用

1. 创建模板文件夹  在项目目录下新建一个文件夹 templates

2. 配置模板目录  os.path.join(BASE_DIR, 'templates')

#项目目录的绝对路径

BASE_DIR = os.path.dirname(os.path.dirnme(os.path.abspath(__file__)))  上了两层

3. 使用模板文件

  a)加载模板文件:去模板目录下面获取html文件的内容,得到一个模板对象

  b)定义模板上下文:向模板文件传递数据

  c)模板渲染:得到一个标准的html内容

 1 #views.py
 2 from django.template import loader,RequestContext
 3 def index(request):
 4     1. 加载模板文件,返回一个模板对象
 5     temp = loader.get_template('booktest/index.html')
 6     2. 定义模板上下文,给模板文件传递数据
 7     context = RequestContext(request, {})
 8     3. 模板渲染:产生标准的html内容,把变量替换掉
 9     res_html = temp.render(context)
10     4. 返回给浏览器    
11     return HttpResponse(res_html)
 1 #views.py
 2 from django.template import loader,RequestContext
 3 def my_render(request, template_path, context_dict):
 4     1. 加载模板文件,返回一个模板对象
 5     temp = loader.get_template(template_path)
 6     2. 定义模板上下文,给模板文件传递数据
 7     context = RequestContext(request, context_dict)
 8     3. 模板渲染:产生标准的html内容,把变量替换掉
 9     res_html = temp.render(context)
10     4. 返回给浏览器    
11     return HttpResponse(res_html)
12 def index(request):
13     return my_render(request, 'booktest/index')
1 #实际这些内容已经封装在render里面了
2 def index(request):
3     return render(request, 'booktest/index.html',{'content':'hello world!'})
1 {{ content }}  #使用模板变量,{{ key }}  #templates/index.html
2 {{ list }}  #使用列表
3 {% for i in list%}  #遍历列表
4         <li>{{i}}</li>
5 {% endfor %}

 

给模板文件传递数据

模板变量使用:{{ 模板变量名 }}

模板代码段:{%代码段%}

for 循环:{%for i in list%}

     {%endfor%}

 

案例完成

准备工作:1.设计出访问页面的url和对应的视图函数的名字,确定视图函数的功能 2.设计模板文件的名字

 1 # views.py
 2 def show_books(request):
 3     '''显示图书的信息'''
 4     # 1.通过M查找图书表中的数据
 5     books = BookInfo.objects.all()
 6     # 2.使用模板
 7     return render(request, 'booktest/show_books.html', {'books':books})
 8 
 9 # urls
10 urlspatterns = [
11     url(r'^books$', show_books),
12 ]
 1 #views.py
 2 def detail(request, bid):
 3     ''' 查询图书关联英雄信息 '''
 4     # 1. 根据bid查询图书信息
 5     book = BookInfo.objects.get(id=bid)
 6     # 2.查询和book关联的英雄信息
 7     heros = book.heroinfo_set.all()
 8     # 3.使用模板
 9     return render(request, 'booktest/detail.html', {'book':book, 'heros':heros})
10 
11 #urls.py
12 urlpatterns = [
13     url(r'^books/(\d+)$', views.detail),
14 ]
 1 <body>
 2 <h1>{{ book.btitle }}</h1>
 3     英雄信息如下:<br/>
 4     <ul>
 5     {% for hero in heros %}
 6         <li>{{ hero.name}} -- {{ hero.hcomment }}</li>
{% empty %}
<li>没有英雄信息</li>
7 {% endfor %} 8 </ul> 9 10 </body>
 1 <body>
 2 图书信息如下:
 3 <ul>
 4     {% for book in books %}
 5         <li><a href="/books/{{book.id}}">   # a标签的href属性-->超链接
6 {{ book.btitle }} 7 </li> 8 {% endfor %} 9 </ul> 10 </body>

 

posted @ 2020-04-15 01:29  LinBupt  阅读(221)  评论(0编辑  收藏  举报