创建一个简单的Django应用

编写一个简单的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,如下图
创建一个简单的Django应用_第1张图片

mytestsite/setting.py的配置

  1. 设置时区:TIME_ZONE
TIME_ZONE = 'Asia/Shanghai'
  1. 关注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

注:

  1. 每个模型都是django.db.models.Model的子类
  2. 每个模型有许多类变量,都标识模型里的一个数据库字段
  3. 每个数据库字段都是Field类的实例,不同类型的Field是告诉Django每个字段要处理的数据类型,每个字段的类实例变量的名字(比如depart_name、login_name)这是字段名,是对机器友好的格式,这些字段名也会作为数据库表的列名
  4. 定义Field类实例时,有些必传参数,比如CharField需要传max_length,这些参数的定义用于数据库结构也用于验证数据;还有一些可选参数,比如设置一个人类友好的名字使用字段verbose_name
  5. ForeignKey定义了关系,表与表之间的数据库关系:多对一、多对多、一对一,而ForeignKey定义了一个多对一的关系

第二步:激活模型

  1. 首先要将应用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'
]
  1. 然后使用数据库更新命令
python manage.py makemigrations autotest
  1. 使用自动执行数据库迁移并同步管理数据库结构的命令
python manage.py migrate

  1. 注:
    (1)主键(IDS)会被自动创建,也可以自定义
    创建一个简单的Django应用_第2张图片

(2) Django会在外键字段名后追加字符串"_id",也可以自定义
创建一个简单的Django应用_第3张图片

(3)外键关系有FOREINGKEY生成

初步尝试使用API

  1. 进入交互式python命令行
python manage.py shell

注:通过manage.py进入python交互式命令行,会设置DJANGO_SETTINGS_MODULE环境变量,会让Django根据mytestsite/setting.py文件来设置python包的导入路径

  1. 尝试数据库API
    创建一个简单的Django应用_第4张图片
    创建一个简单的Django应用_第5张图片
    在这里插入图片描述
  2. 类方法 str() 用来返回创建模型实例时的返回信息,比如Depart模型
    def __str__(self):
        return f"{self.depart_name}"

所以在调用Depart.objects.all()是返回的是]>,而不是]>

  1. 同样,我们也可以为模型添加一些自定义方法

第三步:管理模型

这里可以通过Django的管理站点来进行管理,之后再讲

第四步:创建视图

Django中视图的概念是:一类具有相同功能和模板的网页的集合,比如一个自动化测试管理平台的登录模块中,会创建一下几个视图:

  • 登录页面—员工登录、员工注册等
  • 平台首页—展示一些项目信息、账户操作记录、导航信息等

Django中,网页和其他内容都是从视图派生而来,而每一个视图表现为一个Python函数(或者说方法)
Django会根据用户的URL请求(根据URL中域名之后的部分)来选择使用那个视图,URL样式,如:/login//
为了将URL和视图关联,Django使用了URLconfs来配置,URLconf将URL模式映射到视图

URLconf (URL调度器)

创建一个python模块,这个模块包含URL模式(简单的正则表达式)到python函数(视图)的简单映射

  1. Django处理请求
  • 用户请求Django站点的一个页面

编写视图

在autotest/views.py中添加更多的视图

  1. 添加视图,每个视图必须要做的两件事:(1)返回一个包含被请求页面内容的HttpResponse对象 (2)或者抛出一个异常,比如Http404
  2. 在视图中可以使用任何想用的python库以及读取或者写入数据库等
  3. 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) 运行的结果
创建一个简单的Django应用_第6张图片
注: 这里页面设计写死在视图函数的代码里,如果需要改变页面样式,就需要编辑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
    创建一个简单的Django应用_第7张图片
  • index.html如下
{% if all_depart_list %}
    
{% 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)

响应结果:
创建一个简单的Django应用_第8张图片

  • 捕捉错误,抛出异常
    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)

你可能感兴趣的:(python,django,python,数据库)