Django的基本使用

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('倚天屠龙记')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值