django小案例-2

1.项目创建

1.1 创建django项目

创建项目的命令如下:

bash 复制代码
django-admin startproject test1

创建成功后的文件夹如下图:

init.py: 说明test1是一个python包。

settings.py: 项目的配置文件。

urls.py: 进行url路由的配置。

wsgi.py: web服务器和Django交互的入口。

manage.py: 项目的管理文件。

1.2 创建django app

一个项目由很多个应用组成的,每一个应用完成一个功能模块。

创建app的命令如下:

bash 复制代码
python manage.py startapp booktest

创建好后目录如下:

init.py: 说明目录是一个Python模块。

models.py: 写和数据库项目的内容, 设计模型类。

views.py: ,接收请求,进行处理,与M和T进行交互,返回应答。定义处理函数,视图函数。

tests.py: 写测试代码的文件。

admin.py: 网站后台管理相关的文件。

1.3 app注册

建立应用和项目之间的联系,需要对应用进行注册。

修改settings.py中的INSTALLED_APPS配置项

如下图所示:

1.4 启动项目

启动项目命令如下:

bash 复制代码
python manage.py runserver

2.模型类

2.1 ORM

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

在Django中主要是设计类:模型类。

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

2.2 在settings中配置数据库

原本是下图所示:

我们要改为:

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库名称',
        'HOST':'127.0.0.1',
        'PORT':'3306',
        'USER':'mysql用户名',
        'PASSWORD':'mysql密码',
    }
}

2.3 模型类设计

在应用models.py中设计模型类。

必须继承与models.Model类。

  1. 设计BookInfo类。
  2. 设计HeroInfo类。

Models.ForeignKey可以建立两个模型类之间一对多的关系,django在生成表的时候,就会在多端的表中创建一列作为外键,建立两个表之间一对多的关系。

代码如下:

python 复制代码
# 从 Django 的数据库模块中导入 models 类,用于定义数据库模型
from django.db import models

# Create your models here.
# 定义一个名为 BookInfo 的模型类,继承自 models.Model,用于表示图书信息
class BookInfo(models.Model):
    # 定义一个字符类型的字段 title,用于存储图书的标题,最大长度为 128 个字符
    title = models.CharField(max_length=128)
    # 定义一个日期类型的字段 publist_date,用于存储图书的出版日期
    publist_date = models.DateField()

    # 定义 __str__ 方法,当打印 BookInfo 模型的实例时,返回图书的标题
    def __str__(self):
        return self.title

# 定义一个名为 HeroInfo 的模型类,继承自 models.Model,用于表示英雄信息
class HeroInfo(models.Model):
    # 定义一个字符类型的字段 name,用于存储英雄的名字,最大长度为 50 个字符
    name = models.CharField(max_length=50)
    # 定义一个布尔类型的字段 gender,用于存储英雄的性别,默认值为 False(通常可以约定 False 为女性,True 为男性)
    gender = models.BooleanField(default=False)
    # 定义一个字符类型的字段 comment,用于存储关于英雄的描述信息,最大长度为 128 个字符
    comment = models.CharField(max_length=128)
    # 定义一个外键字段 hbook,关联到 BookInfo 模型。当关联的 BookInfo 实例被删除时,
    # 该英雄信息也会被级联删除(on_delete=models.CASCADE)
    hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)

    # 定义 __str__ 方法,当打印 HeroInfo 模型的实例时,返回英雄的名字
    def __str__(self):
        return self.name

2.4 模型类生成表

1、生成迁移文件,命令如下:

python 复制代码
python manage.py makemigrations

2、执行迁移生成表

python 复制代码
python mange.py migrate

生成迁移的文件在如下图的目录下:

3.后台管理

3.1 配置settings文件

语言和时区的本地化。

修改settings.py文件。

修改如下:

python 复制代码
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

3.2 创建管理员

python 复制代码
python manage.py createsuperuser

创建完之后,可以登录进入网页插入几条数据:

3.3 注册模型类

在应用下的admin.py文件中进行注册,告诉djang框架根据注册的模型类来生成对应表管理页面。

代码如下:

python 复制代码
from django.contrib import admin
from .models import BookInfo,HeroInfo

admin.site.register(BookInfo)
admin.site.register(HeroInfo)

得到的界面如下:

3.4 自定义管理页面

代码如下:

python 复制代码
from django.contrib import admin
from .models import BookInfo,HeroInfo

class BookInfoAdmin(admin.ModelAdmin):
    list_display = ['id','title','publist_date']

class HeroInfoAdmin(admin.ModelAdmin):
    list_display = ['id','name','gender','comment']

admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)

得到的管理界面如下:

4.视图

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

4.1 定义视图函数

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

代码如下:

python 复制代码
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    return HttpResponse('你好啊')

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

4.2 url的配置

url配置的目的是让建立url和视图函数的对应关系。url配置项定义在urlpatterns的列表中,每一个配置项都调用url函数。

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

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

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

b) url(正则表达式,include(应用中的urls文件))

工作中在配置url时,首先在项目的urls.py文件中添加配置项时,并不写具体的url和视图函数之间的对应关系,而是包含具体应用的urls.py文件,在应用的urls.py文件中写url和视图函数的对应关系。

项目的urls.py文件的代码如下:

python 复制代码
from django.contrib import admin
from django.conf.urls import url,include


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include('booktest.urls')),
]

应用的urls.py文件的代码如下:

python 复制代码
from django.conf.urls import url,include
from . import views

urlpatterns = [
    url(r'^index', views.index),
]

网页得到的结果如下:

4.3 url的配置过程

项目 的urls.py文件中包含具体应用 的urls.py文件,应用的urls.py文件中写url和视图函数的对应关系。

当用户输入如http://127.0.0.1:8000/aindex时,去除域名和最前面的/,剩下aindex,拿aindex字符串到项目的urls文件中进行匹配,配置成功之后,去除匹配的a字符,那剩下的index字符串继续到应用的urls文件中进行正则匹配,匹配成功之后执行视图函数index,index视图函数返回内容hello python给浏览器来显示。

5.模板

5.1 模板文件的使用

1、创建模板文件夹

2、配置模板目录

3、定义模板

打开templtes/booktest/index.html文件,定义代码如下:

html 复制代码
<html>
<head>
    <title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i}}<br>
{%endfor%}
</body>
</html>

在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的。

html 复制代码
{{变量名}}

5.2 视图调用模板

调用模板分为三步骤:

  • 1.找到模板
  • 2.定义上下文
  • 3.渲染模板

打开booktst/views.py文件,调用上面定义的模板文件

python 复制代码
from django.http import HttpResponse
from django.template import loader,RequestContext

def index(request):
    # 1.获取模板
    template=loader.get_template('booktest/index.html')
    # 2.定义上下文
    context=RequestContext(request,{'title':'图书列表','list':range(10)})
    # 3.渲染模板
    return HttpResponse(template.render(context))
视图调用模板简写

视图调用模板都要执行以上三部分,于是Django提供了一个函数render封装了以上代码。 方法render包含3个参数:

  • 第一个参数为request对象
  • 第二个参数为模板文件路径
  • 第三个参数为字典,表示向模板中传递的上下文数据

打开booktst/views.py文件,调用render的代码如下:

python 复制代码
from django.shortcuts import render

def index(request):
    context={'title':'图书列表','list':range(10)}
    return render(request,'booktest/index.html',context)

5.3 给模板文件传递数据

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

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

for循环:

{% for i in list %}

list不为空时执行的逻辑

{% empty %}

list为空时执行的逻辑

{% endfor %}

6.完成项目

现在还需要的代码包括三个方面,三个方面顺序不分先后。

  • 1.定义视图
  • 2.定义URLconf
  • 3.定义模板

6.1 定义视图

python 复制代码
from django.shortcuts import render
from django.http import HttpResponse
from .models import BookInfo,HeroInfo

# Create your views here.

def books(request):
    # 查询所有图书
    books=BookInfo.objects.all()
    # 将图书列表传递到模板中,然后渲染模板
    return render(request,'books.html',{'books':books})

def hero(request,bid):
    # 根据图书编号对应图书
    book=BookInfo.objects.get(id=bid)
    # 查找book图书中的所有英雄信息
    heros=book.heroinfo_set.all()
    return render(request,'detail.html',{'book':book,'heros':heros})

6.2 定义URLconf

编写test1/urls.py文件如下:

python 复制代码
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include('booktest.urls')),
]

编写booktest/urls.py文件如下:

python 复制代码
from django.conf.urls import url,include
from . import views

urlpatterns = [
    url(r'^books$', views.books),
    #配置详细页url,\d+表示多个数字,小括号用于取值,
    url(r'^books/(\d+)$',views.hero),
]

6.3 定义模板

编写templates/books.html文件如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<h1>图书信息如下:</h1>
<ul>
    {% for book in books %}
    <li><a href="books/{{book.id}}">{{book.title}}</a></li>
    {% endfor %}
</ul>

</body>
</html>

编写templates/detail.html文件如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{book.title}}</h1>
英雄信息如下:

<ul>
    {% for hero in heros %}
    <li>{{hero.name}}--{{hero.comment}}</li>
    {% empty %}
    <li>没有英雄信息</li>
    {% endfor %}
</ul>
</body>
</html>

结果:

相关推荐
字节王德发15 分钟前
如何用Python和Selenium实现表单的自动填充与提交?
开发语言·python·selenium
genispan1 小时前
python基础8 单元测试
开发语言·python·单元测试
灏瀚星空3 小时前
在 Visual Studio Code 中高效使用 Pylance:配置、技巧与插件对比
ide·经验分享·vscode·python·编辑器·学习方法
无极低码4 小时前
FLASK和GPU依赖安装
后端·python·flask
星际编程喵4 小时前
Flask实时监控:打造智能多设备在线离线检测平台(升级版)
后端·python·单片机·嵌入式硬件·物联网·flask
钢铁男儿5 小时前
Python 生成数据(随机漫步)
开发语言·python·信息可视化
赛卡5 小时前
自动驾驶背后的数学:特征提取中的线性变换与非线性激活
人工智能·python·机器学习·自动驾驶·numpy
正经教主5 小时前
【菜鸟飞】在vsCode中安装python的ollama包出错的问题
开发语言·人工智能·vscode·python·ai·编辑器
yechaoa6 小时前
【揭秘大厂】技术专项落地全流程
android·前端·后端
逛逛GitHub6 小时前
推荐 10 个受欢迎的 OCR 开源项目
前端·后端·github