第一步,创建一个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,如下图
TIME_ZONE = 'Asia/Shanghai'
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
注:
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
(2) Django会在外键字段名后追加字符串"_id",也可以自定义
(3)外键关系有FOREINGKEY生成
python manage.py shell
注:通过manage.py进入python交互式命令行,会设置DJANGO_SETTINGS_MODULE环境变量,会让Django根据mytestsite/setting.py文件来设置python包的导入路径
def __str__(self):
return f"{self.depart_name}"
所以在调用Depart.objects.all()是返回的是
这里可以通过Django的管理站点来进行管理,之后再讲
Django中视图的概念是:一类具有相同功能和模板的网页的集合,比如一个自动化测试管理平台的登录模块中,会创建一下几个视图:
Django中,网页和其他内容都是从视图派生而来,而每一个视图表现为一个Python函数(或者说方法)
Django会根据用户的URL请求(根据URL中域名之后的部分)来选择使用那个视图,URL样式,如:/login//
为了将URL和视图关联,Django使用了URLconfs来配置,URLconf将URL模式映射到视图
创建一个python模块,这个模块包含URL模式(简单的正则表达式)到python函数(视图)的简单映射
在autotest/views.py中添加更多的视图
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的模板系统,可以将页面的设计从代码中分离出来。
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子目录
{% if all_depart_list %}
{% for depart in all_depart_list %}
- {{ depart.depart_name }}
{% endfor %}
{% else %}
No polls are available.
{% 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)