编写一个简单的Django应用
第一步,创建一个Django项目,pycharm需要专业版才能创建Django应用。
注: 创建mytestsite的Django应用
数据库配置
mytestsite/settting.py 中配置DATABASES的default配置
默认配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
如果需要修改为其他数据库,则
ENGIEN可选值有:
django.db.backends.sqlite3
django.db.backends.postgresql
django.db.backends.mysql
django.db.backends.oracle
NAME 数据库名称
如果使用的是sqlite3,是电脑上的一个文件,则NAME是文件的绝对路径,否则就是数据库名称,如我建立了一个远程msyql的数据库mysite,且必须设置一些额外设置,比如USER、PASSWORD、HOST,如下图

mytestsite/setting.py的配置
- 设置时区:TIME_ZONE
TIME_ZONE = 'Asia/Shanghai'
- 关注INSTALLED_APPS设置项,包含了项目中弃用的所有Django应用,可以在多个项目中使用,也可以打包并且发布应用,让别人使用,默认自带应用
INSTALLED_APPS = [
'django.contrib.admin', 管理员站点
'django.contrib.auth', 认证授权系统
'django.contrib.contenttypes', 内容类型框架
'django.contrib.sessions', 会话框架
'django.contrib.messages', 消息框架
'django.contrib.staticfiles', 管理静态文件的框架
]
这些默认开启的某些应用需要至少一个数据库表,所以在使用他们之前需要在数据库中创建一些表,调用命令:
python manage.py makemigrations 检测是否有更新
python manage.py migrate 执行创建、更新、删除数据库表
第一步:创建模型
定义模型:数据库结构设计和附加的其它元数据。一个模型定义了数据的信息源,包含了不可缺少的数据区域和存储数据的行为。Django的迁移代码是由模型文件自动生成,本质是一个历史记录。
注:创建一个应用管理平台,第一步是登录管理,在登录管理中涉及到用户管理,在一个企业中,用户相关的数据有,部门信息、员工信息,所以创建两个模型:部门Depart 和员工 Employee
from django.db import models
class Depart(models.Model):
depart_name = models.CharField("部门名称", max_length=255, blank=False)
up_depart = models.ForeignKey("Depart",verbose_name="上级部门编号", on_delete=models.CASCADE, blank=True,null=True)
depart_remark = models.CharField("部门职能描述", max_length=255, blank=False)
def __str__(self):
return f"{self.depart_name}"
class Meta:
db_table = "depart"
verbose_name = '部门信息'
verbose_name_plural = verbose_name
class Employee(models.Model):
login_name = models.CharField("用户名", max_length=255, blank=False)
password = models.CharField("登录密码", max_length=255, blank=False)
user_name = models.CharField("真实姓名", max_length=255, blank=False)
depart = models.ForeignKey("Depart",verbose_name="部门编号", on_delete=models.CASCADE, blank=True,null=True,help_text="所属部门")
level = models.CharField("管理级别", max_length=255, blank=False)
def __str__(self):
return f"({self.depart}){self.user_name}"
class Meta:
db_table = "employee"
verbose_name = '员工信息'
verbose_name_plural = verbose_name
注:
- 每个模型都是django.db.models.Model的子类
- 每个模型有许多类变量,都标识模型里的一个数据库字段
- 每个数据库字段都是Field类的实例,不同类型的Field是告诉Django每个字段要处理的数据类型,每个字段的类实例变量的名字(比如depart_name、login_name)这是字段名,是对机器友好的格式,这些字段名也会作为数据库表的列名
- 定义Field类实例时,有些必传参数,比如CharField需要传max_length,这些参数的定义用于数据库结构也用于验证数据;还有一些可选参数,比如设置一个人类友好的名字使用字段verbose_name
- ForeignKey定义了关系,表与表之间的数据库关系:多对一、多对多、一对一,而ForeignKey定义了一个多对一的关系
第二步:激活模型
- 首先要将应用autotest安装到Django项目中,即配置到mytestsite/settings.py 的INSTALLED_APPS中,在这个配置变量列表后面添加autotest的应用名称即可,如
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'autotest'
]
- 然后使用数据库更新命令
python manage.py makemigrations autotest
- 使用自动执行数据库迁移并同步管理数据库结构的命令
python manage.py migrate
- 注:
(1)主键(IDS)会被自动创建,也可以自定义

(2) Django会在外键字段名后追加字符串"_id",也可以自定义

(3)外键关系有FOREINGKEY生成
初步尝试使用API
- 进入交互式python命令行
python manage.py shell
注:通过manage.py进入python交互式命令行,会设置DJANGO_SETTINGS_MODULE环境变量,会让Django根据mytestsite/setting.py文件来设置python包的导入路径
- 尝试数据库API



- 类方法 str() 用来返回创建模型实例时的返回信息,比如Depart模型
def __str__(self):
return f"{self.depart_name}"
所以在调用Depart.objects.all()是返回的是<QuerySet [<Depart: 研发中心>]>,而不是<QuerySet [<Depart: (id的值)>]>
- 同样,我们也可以为模型添加一些自定义方法
第三步:管理模型
这里可以通过Django的管理站点来进行管理,之后再讲
第四步:创建视图
Django中视图的概念是:一类具有相同功能和模板的网页的集合,比如一个自动化测试管理平台的登录模块中,会创建一下几个视图:
- 登录页面—员工登录、员工注册等
- 平台首页—展示一些项目信息、账户操作记录、导航信息等
Django中,网页和其他内容都是从视图派生而来,而每一个视图表现为一个Python函数(或者说方法)
Django会根据用户的URL请求(根据URL中域名之后的部分)来选择使用那个视图,URL样式,如:/login//
为了将URL和视图关联,Django使用了URLconfs来配置,URLconf将URL模式映射到视图
URLconf (URL调度器)
创建一个python模块,这个模块包含URL模式(简单的正则表达式)到python函数(视图)的简单映射
- Django处理请求
- 用户请求Django站点的一个页面
编写视图
在autotest/views.py中添加更多的视图
- 添加视图,每个视图必须要做的两件事:(1)返回一个包含被请求页面内容的HttpResponse对象 (2)或者抛出一个异常,比如Http404
- 在视图中可以使用任何想用的python库以及读取或者写入数据库等
- Django只要求返回是一个HttpResponse 或者抛出一个异常
简单编写一个部门信息展示页面,展示5个部门信息
(1)编写视图
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from .models import Depart
def index(request):
"""
:param request:
:return:
"""
# 按id正向排序展示5行数据
all_depart_list = Depart.objects.order_by('id')[:5]
# 拼接展示字符串
output=", ".join(depart.depart_name for depart in all_depart_list)
# 调用响应
return HttpResponse(output)
(2)创建URLconf,在autotest下创建一个python模块urls.py
from django.urls import path
from . import views
urlpatterns=[
path('',views.index,name='index'),
]
(3) 在Django项目站点mytestsite/urls.py下添加autotest.urls的配置
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('autotest/',include('autotest.urls')),
path('admin/', admin.site.urls),
]
(4) 运行的结果

注: 这里页面设计写死在视图函数的代码里,如果需要改变页面样式,就需要编辑python代码,我们可以使用Django的模板系统,可以将页面的设计从代码中分离出来。
- 在autotest应用目录里创建一个templates目录,Django将会在这个目录里查找模板文件

mytestsite/settings.py中的TEMPLATES配置项描述了Django如何载入和渲染模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
将APP_DIRS设置为True,将会让DjangoTemplates在每个INSTALLED_APPS文件夹中寻找templates子目录
- 在autotest/templates目录里,再创建一个目录autotest,在其中新建一个文件index.html,随意模板路径是:autotest/templates/autotest/index.html

- index.html如下
{% if all_depart_list %}
<ul>
{% for depart in all_depart_list %}
<li><a href="/polls/{{ depart.id }}/">{{ depart.depart_name }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
- 使用模板的视图函数如下
from django.template import loader
def index(request):
"""
:param request:
:return:
"""
# 按id正向排序展示5行数据
all_depart_list = Depart.objects.order_by('id')[:5]
# # 拼接展示字符串
# output=", ".join(depart.depart_name for depart in all_depart_list)
# 载入autotest/index.html模板文件
template = loader.get_template("autotest/index.html")
# 定义模板文件应用的上下文(context),是一个字典,将模板内的变量映射为python对象
context = {
'all_depart_list':all_depart_list
}
# 载入模板文件,且传递一个上下文(context)
return HttpResponse(template.render(context,request))
render()函数,载入模板,填充上下文,再返回由它生成的HttpResponse对象,直接导入render函数,就无需导入loader和HttpResponse,不过还有其他的视图需要用到HttpResponse,就要保持其导入
def index(request):
"""
:param request:
:return:
"""
# 按id正向排序展示5行数据
all_depart_list = Depart.objects.order_by('id')[:5]
# # 拼接展示字符串
# output=", ".join(depart.depart_name for depart in all_depart_list)
# 载入autotest/index.html模板文件
# template = loader.get_template("autotest/index.html")
# 定义模板文件应用的上下文(context),是一个字典,将模板内的变量映射为python对象
context = {
'all_depart_list':all_depart_list
}
# 载入模板文件,且传递一个上下文(context)
# return HttpResponse(template.render(context,request))
return render(request,'autotest/index.html',context)
响应结果:

-
捕捉错误,抛出异常
def index(request):
“”":param request:
:return:
“”"
try:
# 按id正向排序展示5行数据
all_depart_list = Depart.objects.order_by(‘id’)[:5]
# # 拼接展示字符串
# output=", ".join(depart.depart_name for depart in all_depart_list)
# 载入autotest/index.html模板文件
# template = loader.get_template(“autotest/index.html”)
# 定义模板文件应用的上下文(context),是一个字典,将模板内的变量映射为python对象
context = {
‘all_depart_list’:all_depart_list
}
# 载入模板文件,且传递一个上下文(context)
# return HttpResponse(template.render(context,request))
except Depart.DoesNotExist:
raise Http404(“Depart does not exist”)return render(request, ‘autotest/index.html’, context)
本文详细介绍了如何创建一个Django应用,包括数据库配置、模型定义、数据库迁移和视图的创建。首先,讲解了Django项目和应用的创建,并展示了如何配置SQLite3数据库。接着,定义了 Depart 和 Employee 两个模型,用于部门管理和员工信息。通过makemigrations和migrate命令更新数据库。然后,展示了如何使用Django的模型API进行数据操作。最后,介绍了视图的创建,包括如何编写视图函数、URLconf配置以及使用模板系统将数据展示在网页上。此外,还讨论了错误处理和异常抛出。
1283

被折叠的 条评论
为什么被折叠?



