Django基础

1.配置环境

确保自己的设备有python的环境是前提

pip install django
pip install pymysql 

2.创建Django项目

在存放项目的文件夹内打开终端(cmd)

2.1 用指令创建项目文件

django-admin startproject *** (项目名)

2.2 使用 manage.py创建app应用

创建好项目后,进入到项目文件夹,输入以下指令

python manage.py startapp *** (app项目名)

一个Django项目是可以有多个应用的,可以根据需要创建


3.配置文件 settings.py

3.1项目结构

  • 项目文件夹

    • 项目同名文件夹
      • __init__.py
      • asgi.py
      • settings.py -----(操作此文件)
      • urls.py
      • wsgi.py
    • app应用文件夹
      • __init__.py
      • admin.py
      • apps.py
      • models.py
      • tests.py
      • views.py
    • manage.py

3.2 注册app

INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',#app名称
]

3.3 配置模板文件

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates/html')],
        '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',
            ],
        },
    },
]

3.4 连接数据库

这是连接mysql数据库的,如果想用django自带的数据库,可以跳过该步骤

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',        #数据库名 
        'USER': 'root',        #用户名
        'PASSWORD': '123456',  #密码
        'HOST': '127.0.0.1',   #地址
        'PORT': 3306           #端口
    }
}

在项目同名文件夹下的 __init__.py文件中加入以下代码

import pymysql
pymysql.version_info=(1,4,13,"final",0)
pymysql.install_as_MySQLdb()

3.5 配置静态文件


STATIC_URL = '/static/'

STATICFILES_DIRS=[ 
    os.path.join(BASE_DIR,'static'),
] 

STATIC_ROOT = os.path.join(BASE_DIR, "/static/")


# media
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

配置完成后,在项目中分别创建templates、static、media三个文件夹


4.建立模型

当前目录结构

  • 项目文件夹
    • media
    • static
    • templates
    • 项目同名文件夹
      • __init__.py
      • asgi.py
      • settings.py
      • urls.py
      • wsgi.py
    • app应用文件夹
      • __init__.py
      • admin.py
      • apps.py
      • models.py --(操作文件)
      • tests.py
      • views.py
    • manage.py

4.1 编辑 models.py

from django.db import models

class departInfo(models.Model):
    class Meta:
        app_label = 'app' #指定app名称
        db_table = 'depart' # 指定表名
        # verbose_name = "部门"  #后台名称 复数
        verbose_name_plural = "部门"  #后台名称 单数
    dname = models.CharField(verbose_name="部门名称", max_length=200)


class userInfo(models.Model):
    class Meta:
        db_table = 'user'  # 指定表名
    #字符类型
    name = models.CharField(verbose_name="姓名", max_length=200)
    #特殊int类型,default为设置默认值
    y = ((0, "女"), (1, "男"))
    sex = models.SmallIntegerField(verbose_name="性别", choices=y, default=1)
       #时间类型,auto_now_add为添加时间
    startdate = models.DateTimeField(verbose_name="时间",auto_now_add=True)
    #int类型, null=True, blank=True表示可以为空
    age = models.IntegerField(verbose_name="年龄", null=True, blank=True)
    #外键,on_delete是外键删除处理事件
    departname = models.ForeignKey(verbose_name="所在部门", to="departInfo", to_field="id", on_delete=models.SET_DEFAULT, default=-1)
    # null=True,blank=True,on_delete=models.SET_NULL 是设置为空
    # on_delete=models.SET_DEFAULT,default=Category.objects.get(pk=2)||default=4  是设置为默认值
    #  on_delete=models.CASCADE 全删!!

4.2 迁移数据至数据库

在项目文件夹内打开cmd终端,运行python manage.py可以查看全部指令

在终端运行以下代码

#生成数据迁移文件 
python manage.py makemigrations ****(应用app名称,单app也可以省略)
#数据迁移至数据库
python manage.py migrate

如果后续 models.py文件内容有改动,则需要重新运行这两行指令


5.编写视图函数

打开应用app文件下 views.py文件

from django.shortcuts import render, redirect
from app.models import *
def index(request):
    x=userInfo.objects.all()#查询所有
    return render(request, "index.html", {"x": x})#locals() 是返回全部局部变量

基础orm操作

#查
userInfo.objects.all()#查询所有
userInfo.objects.filter(字段=查找字段)#没有查询对象不会报错,查找的是集合
userInfo.objects.get(字段=查找字段)#没有查询对象会报错,查找后返回model对象
#增
userInfo.objects.create(字段名=添加值)
#删
userInfo.objects.filter(字段名=查找值).delete()
#修
userInfo.objects.filter(字段名=查找值).update(字段名=修改值)

6.配置路由

6.1设置app路由映射

项目同名文件夹中打开 urls.py

from django.contrib import admin
from django.urls import path,include,re_path

from django.conf import settings
from django.views.static import serve


urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('app.urls')),
    re_path(r'media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]

6.2编写app应用路由

在应用app下创建 urls.py文件

from django.urls import path,include
from app import views

urlpatterns = [
    path('',views.index,name="index"),
]

7.创建模板文件

当前目录结构

  • 项目文件夹

    • media
    • static
      • index.css (新增)
    • templates
      • index.html (新增)
    • 项目同名文件夹
      • __init__.py
      • asgi.py
      • settings.py
      • urls.py
      • wsgi.py
    • app应用文件夹
      • __init__.py
      • admin.py
      • apps.py
      • models.py
      • tests.py
      • urls.py
      • views.py
    • manage.py

在templates文件夹下创建 index.html文件

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <h1>展示数据</h1>
        <table border="1">
            <tr>
                <th>id</th>
                <th>姓名</th>
                <th>性别</th>
                <th>加入时间</th>
                <th>部门</th>
            </tr>
            {# 使用for循环遍历 #}
            {%for i in x%}
            <tr>
                 <td>
                     {#循环次数#}
                    {{forloop.counter}}
                 
                </td>
                <td>
                    {{i.name}}
                </td>
                <td>
                    {#sex的值是0或1,用get_sex_display可以直接获取对应的名称#}
                    {{i.get_sex_display}}
                    <!-- 
                        也可以用if判断的写法,如下:
                        {%if i.sex == 1%}
                        男
                        {%else%}
                        女
                        {%endif%}
                        -->
                </td>
                <td>
                    {#可视化时间类型的变量#}
                    {{i.startdate|date:"Y-m-d D H:i"}}
                </td>
                 <td>
                    {#外键字段直接点字段名取值#}
                    {{i.departname.dname}}
                </td>
            </tr>
            {%endfor%}
        </table>
    </body>
</html>

8.启动项目

在项目文件夹中打开cmd终端

#输入指令
python manage.py runserver

#也可以指定端口
python manage.py runserver 8000

打开任意浏览器,最好不是IE;输入网址 127.0.0.1:8000(需要注意端口要和你启动的端口一致)

确认项目跑起来了可以直接点击这里127.0.0.1:8000


9.GET和POST请求

setting.py文件中

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',这个是Django自带的保护机制,开发时候可以注释掉,但是为了安全最好不要注释
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

先进行通用操作,在模板文件夹templates下创建 dome.html,代码如下

<!DOCTYPE html>
  <html lang="en">
   <head>
         <meta charset="UTF-8">
         <meta http-equiv="X-UA-Compatible" content="IE=edge">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <title>Document</title>
     </head>
     <body>
         <a href="/get/?name='cwm'">发送get请求</a>
         <form action="/post/" method="post">
              {# 如果在setting.py文件中注释了安全协议,可以不加 {% csrf_token %} #}
             {# 否则所有的post请求中都必须加上{% csrf_token %} #}
             {% csrf_token %}
  
             <input type="text" name="name" value="cwm">
             <button type="submit">发送post请求</button>
         </form>
     </body>
 </html>

然后配置路由在app文件夹下的 urls.py;代码如下

urlpatterns = [
     path('index/', views.index),
     path('get/', views.request_get),
     path('post/', views.request_post),
 ]

9.1GET请求

在视图函数文件中的 views.py

def request_get(request):
    x=request.GET.get('name')
    return HttpResponse(x)

9.2POS请求

在视图函数文件中的 views.py

def request_post(request):
    x=request.POST.get('name')
    return HttpResponse(x)

9.3关于路由的内置函数

def index(request):
    # 获取请求方式
    request.method == "GET"
    # 获取请求IP
    ip_address = request.META.get('REMOTE_ADDR')
    # 获取请求的路由信息
    current_route = request.path
    #获取请求参数
    x=request.GET.get('name') #GET是请求方式,name是参数的key