django

🌱开发环境

python3.7

django

win10(64位)

什么是框架

通俗的说,框架是实现某种功能的半成品,提供了一些常用的工具类和一些基础通用化的组件,可以供开发人员在此基础上,更高效的满足各自的业务需求。

为什么要使用框架

一个优秀的的框架,它相当于是一个模板代码库,很多基础性的功能,底层功能操作都已经帮我们实现了,我们只需要专心的实现所需要的业务逻辑就可以了。这样,就大大提高了我们的开发效率,所以技术的发展,多数情况下是为了满足业务的需求。

简单,快捷,高效,响应,兼容

什么是django

我们都知道,Django是基于Python的Web开发框架。

百度百科介绍:

Django是一个开放源代码Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。

这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

有一家劳伦斯的出版社,说白了就想新浪。这种网站会涉及到什么问题呢我们来看一下:

在这里插入图片描述

只需进行数据库替换,采用此模板样式不变,那网站的开发速率提高

django目的和用途

django的主要目的是简便,快速的开发数据库驱动的网站,他强调代码复用。

多个组件看依方便的以“插件”形式服务整个框架

{{{row
{{{row
所有的web框架的意义都在于:

  1. 搭建框架应用
  2. 免去不同web应用相同代码的部分重复编写,只需关心应用核心的业务实现

}}}

}}}

django的特点

对比Flask框架,Django原生提供了众多的功能组件,让开发更便捷

  1. 提供项目工程管理的自动脚手工具(脚手架工具)
  2. 数据库ORM支持(对象关系映射)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GygyZD04-1632645131208)(assets/image-20210921214755-gc5rj3l.png)]【不会sql语句也可以实现】
  3. 模板【replace,可以通过变量将模板和数据打通。使用数据替换模板变量,达到动态展示效果】
  4. 表单【表单获取直接转化成对象处理】
  5. admin管理站点【自动生成后台】
  6. 文件管理
  7. 认证权限
  8. session机制
  9. 缓存

在这里插入图片描述

如果Django类似于精装修的房子,自带豪华家具、非常齐全功能强大的家电,什么都有了,拎包入住即可,十分方便。重量级框架,快捷。

在这里插入图片描述

而Flask类似于毛坯房,自己想把房子装修成什么样自己找材料,买家具自己装。材料和家具种类非常丰富,并且都是现成免费的,直接拿过去用即可。轻量级,灵活。

MVT设计模式

前端客户端发起请求,请求可能是用户点击浏览器发起的,app,ajax请求或是爬虫程序,

服务器:接受和解析http请求报文,他的服务对象是http请求

框架:后端服务框架,服务器解析成字典格式{”request_path“:request}

视图:定义数据处理方法:index()然后经处理完的结果变成响应对象,发送给服务器

中间层:装饰器

作用:在不添加源代码的情况下增加功能

#补充知识点#

((20210923102902-68l094i))

WSGI只是一个PythonWeb服务器网关接口协议,或者说是一份标准,用来描述Server与Framework之间的通信接口。

这样,一些符合WSGI标准的Framework如Flask、Django、web.py等等就可以与同样符合WSGI标准的Server库进行无缝对接。

只要你的Framework符合WSGi规范,那么在以后有了效率更高的Server的时候,你可以毫不费力地将代码迁移过去。

#场景#:开发了几个应用后,发现每个应用都完成了从监听网络端口到建立连接、解析请求的参数、进行回应、发送Response数据包等等一系列的工作,每次都要在获取请求、解析请求、发送请求这些一成不变的步骤上花费大量时间,不如写个Server模块,把这些功能单独实现,以后再有新的需求,只需要考虑Framework部分即可,这样就可以避免“重复造轮子”了。当自己写好了一套server程序,隔壁老王听说你写了个Server程序很牛掰,想要借用一下你的代码。你本着开源精神将Server模块分享给他,可是,老王拿到代码一看就傻眼了——天啊,你的Server部分的数据接口、函数调用方式和他自己写的Framework完全不搭,改动起来难度颇大,还不如自己再写一个Server来得方便。应该整一套接口规范出来,让老王在编写自己的Framework的时候就按照你设计的规范来写,这样写出来的程序才能够互相“契合”,便于调试和使用。就是WSGI(Python Web Server Gateway)

MVC

程序设计模式:MVC,核心思想**:分工,解耦**,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容
在这里插入图片描述

M全拼为Model,主要封装对数据库的访问,对数据库中数据进行增删改查操作

V全拼为View,用于封装结果,生成页面展示的html

C全拼Controller,用于接收请求,处理业务逻辑,与Model和View进行交互,返回结果

MVT

原理就是mvc不过自己将名字改了

在这里插入图片描述

M全拼为Model,与MVC中的M功能相同,主要封装对数据库的访问,对数据库中数据进行增删改查操作

V全拼为View,与MVC中的C功能相同,用于接收请求,处理业务逻辑,与Model和View进行交互,返回结果

T全拼Template,与MVC中的V功能相同,用于封装结果,负责封装构造要返回的html

((20210924115549-5h51jh6))

虚拟环境

什么场景需要用虚拟环境

在这里插入图片描述
在这里插入图片描述

比如两个项目在并行,然后用到的python和django版本不一样

解释器一样包都可能不一样

虚拟环境效果

[ 在这里插入图片描述

((20210923111014-udk4aum))

实战

搭建环境

默认会下载最新版本

pip install django
在这里插入图片描述

创建工程

进入想要创建的项目目录

在这里插入图片描述

再命令行中输入

django-admin startproject todo

查看文件

采用pycharm打开项目

然后进入项目中

cd todo

在这里插入图片描述

尝试启动服务器

在开发阶段,未来能够快速预览到开发效果
django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用。

python manage.py runserver

在这里插入图片描述

在这里插入图片描述

这样这是成功

python manage.py migrate

在这里插入图片描述

创建管理员账号

python manage.py createsuperuser

在这里插入图片描述

重新启动服务器:

在这里插入图片描述

登陆刚注册号的账号密码

进入数据管理页面 http://localhost:8000/admin

在这里插入图片描述

终止服务器,Ctrl+C

创建子应用

python manage.py startapp tasks

在这里插入图片描述

查看目录中的结构

在这里插入图片描述

配置app路径

然计算机找到创建的app

在添加

'tasks'

查找定位到app的路径

在这里插入图片描述

跟项目路径:

之前django2.x

BASE_DIR =as.path.dirname(os.path.dirname(os.path.abspath(__file__)))

引入path之后

BASE_DIR = Path(__file__).resolve().parent.parent

C:\Users\yangs\Desktop\新建文件夹\todo\todo\settings.py

创建视图函数

再app tasks中创建视图函数 view index

from django.shortcuts import render 
from django.http import    HttpResponse 
## Create your views here. 
def index(request):   
    return HttpResponse('hello djangho')

在这里插入图片描述

创建urls路由

在这里插入图片描述

配置项目urls

在这里插入图片描述

"""todo URL Configuration  The `urlpatterns` list routes URLs to views. 
For more information please see:     https://docs.djangoproject.com/en/3.2/topics/http/urls/ 
Examples: Function views  
1. Add an import:  from my_app import views   
2. Add a URL to urlpatterns:  path('', views.home, name='home') Class-based views  
1. Add an import:  from other_app.views import Home   
2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home') Including another URLconf   
1. Import the include() function: from django.urls import include, path   
2. Add a URL to urlpatterns:  path('blog/', include('blog.urls')) """ 
from django.contrib import admin 
from django.urls import path,include  
urlpatterns = [
path('admin/', admin.site.urls),   
path('',include('tasks.urls')) ]

重启服务器

重新启动服务器python manage.py runserver

在这里插入图片描述

创建模板

创建文件夹templates中再创建tasks文件夹中创建list.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yhxl9wbo-1632645131300)(assets/clipboard-20210921230301-1lv02wo-20210924095934-379n9oy.png)]

<h3>TODO</h3>

修改视图

修改app tasks 中的views

在这里插入图片描述

from django.shortcuts import render
from django.http import    HttpResponse
# Create your views here.
def index(request):
    return render(request,'tasks/list.html')

此时出现

在这里插入图片描述

别着急看看错误提示

配置模板默认路径

显示找不到list.html文件,所以我们将从配置setting中设置

在这里插入图片描述

"""
Django settings for todo project.

Generated by 'django-admin startproject' using Django 3.2.6.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-+(9j8^8xt6(5aa79o^bp8g8#t#lpuif3u424yx55bz=yrk@)d%'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tasks',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'todo.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #连接成模板目录
        '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',
            ],
        },
    },
]

WSGI_APPLICATION = 'todo.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

此时刷新一下:

在这里插入图片描述

创建模型

之后我们来创建model文件

在这里插入图片描述

from django.db import models

# Create your models here.

class Task(models.Model):
    title=models.CharField(max_length=200)
    complete=models.BooleanField(default=False)
    create=models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

再命令行中输入:

更新数据库

python manage.py makemigrations

在这里插入图片描述

python manage.py migrate

在这里插入图片描述

将数据库进行更新

启动服务器:

python manage.py runserver

在这里插入图片描述

访问8000:/admin

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLguiQfn-1632645131322)(assets/clipboard-20210921230301-svzfg5q-20210924095934-vw2uo7h.png)]

没有发现新建的model

用户和model进行关联

需要将用户和model进行关联

在app tasks中admin中

在这里插入图片描述

from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Task)

重新刷新页面 在这里插入图片描述

其中新创建的模块

添加数据库数据

添加数据并在数据库中查看数据:

在这里插入图片描述


在这里插入图片描述

现在我们想要将数据库中的数据显示在views中

将models中映射的数据放在view中展示出来

展示数据

在这里插入图片描述

修改view

在app tasks中view修改

from django.shortcuts import render
from django.http import    HttpResponse
from .models import *

# Create your views here.
def index(request):
    tasks=Task.objects.all()
    context={'tasks',tasks}
    return render(request,'tasks/list.html',context)

修改html

将数据传入模板当中

list.html

在这里插入图片描述

<h3>TO DO</h3>
{% for task in tasks %}
<p>task.title</p>
{% endfor %}

在app tasks中创建form文件

创建form

from django import forms
from django.forms import ModelForm
from .models import *

class TaskForm(forms.ModelForm):
    class Meta:
        model=Task
        fields='__all__'

在这里插入图片描述

修改view

在view中更改:

from django.shortcuts import render
from django.http import    HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)

在这里插入图片描述

更改模板文件:

<h3>TO DO</h3>
<form>
    {{form}}
    <input type="submit" name="create Task">
</form>
{% for task in tasks %}
<p>{{task.title}}</p>
{% endfor %}

在这里插入图片描述

查看页面:

在这里插入图片描述

添加数据

修改模板html页面:

<h3>TO DO</h3>
<form method="POST" action="/">
    {{form}}
    <input type="submit" name="create Task">
</form>
{% for task in tasks %}
<p>{{task.title}}</p>
{% endfor %}

在这里插入图片描述


在这里插入图片描述

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')
    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)

启动发现:

输入数据点击提交

在这里插入图片描述

此时我们设置一下list,html

修改html

<h3>TO DO</h3>
<form method="POST" action="/">
    {% csrf_token %} #数据发送django自带保护机制
    {{form}}
    <input type="submit" name="create Task">
</form>
{% for task in tasks %}
<p>{{task.title}}</p>
{% endfor %}

在这里插入图片描述

在页面上测试添加

在这里插入图片描述

成功,现在我们来编写

修改页面

先在模板下创建update_task.html页面

修改html

在这里插入图片描述

<h3>Update Task</h3>
<form>
    <input type="submit" name="Update Task">
</form>

修改view

在views页面中进行修改:

在这里插入图片描述

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)
def updateTask(request,pk):
    task=Task.objects.all(id=pk)
    return render(request,'tasks/update_task.html')

在这里插入图片描述

修改url

修改app task中的urls

from django.urls import path
from . import views

app_name = 'tasks'
urlpatterns = [
    path('', views.index, name='list'),
    path('update_task/<str:pk>',views.updateTask,name='update_task'),
]

在这里插入图片描述


在这里插入图片描述


接着我们需要在修改页面写入响应的数据和输入框

在这里插入图片描述

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)

def updateTask(request,pk):
    task=Task.objects.get(id=pk)
    form=TaskForm(instance=task)
    context={'form':form}
    return render(request,'tasks/update_task.html',context=context)

修改html

修改模板update_task页面:

在这里插入图片描述

<h3>Update Task</h3>
<form>
    {% csrf_token %}
    {{form}}
    <input type="submit" name="Update Task">
</form>

页面显示
在这里插入图片描述


在这里插入图片描述

这里只是显示出来还不能修改

修改页面

在这里插入图片描述

<h3>Update Task</h3>
<form method="post" action="">
    {% csrf_token %}
    {{form}}
    <input type="submit" name="Update Task">
</form>

修改view文件:

在这里插入图片描述

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)

def updateTask(request,pk):
    task=Task.objects.get(id=pk)
    form=TaskForm(instance=task)
    if request.method=='POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('/')
    context={'form':form}
    return render(request,'tasks/update_task.html',context=context)


在这里插入图片描述

修改功能实现

删除功能

开始删除功能

新建html

在这里插入图片描述

创建删除模板

<p>Are you sure want to delete "{{item}}" ?</p>
<a href="{% url 'tasks:list'%}">Cancel</a>

修改views

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *
#Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)

def updateTask(request,pk):
    task=Task.objects.get(id=pk)
    form=TaskForm(instance=task)
    if request.method=='POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('/')
    context={'form':form}
    return render(request,'tasks/update_task.html',context=context)
def deleteTask(request,pk):
    return render(request,'tasks/delete.html')

在这里插入图片描述

修改url文件

在这里插入图片描述

from django.urls import path
from . import views

app_name = 'tasks'
urlpatterns = [
    path('', views.index, name='list'),
    path('update_task/<str:pk>',views.updateTask,name='update_task'),
    path('delete/<str:pk>', views.deleteTask, name='delete_task'),
]

再次修改view文件

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *

Create your views here.

def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)
def updateTask(request,pk):
    task=Task.objects.get(id=pk)
    form=TaskForm(instance=task)
    if request.method=='POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('/')
    context={'form':form}
    return render(request,'tasks/update_task.html',context=context)

def deleteTask(request,pk):
    item=Task.objects.get(id=pk)
    context={'item':item}
    return render(request,'tasks/delete.html',context)<br />

查看页面

在这里插入图片描述


修改html删除页面

<p>Are you sure want to delete "{{item}}" ?</p>
<a href="{% url 'tasks:list' %}">Cancel</a>
<form method="POST" action="">
    {% csrf_token %}
    <input type="submit" name="Confirm">
</form>

在这里插入图片描述

页面展示

在这里插入图片描述

修改views文件

from django.shortcuts import render,redirect
from django.http import    HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
    tasks=Task.objects.all()
    form=TaskForm()
    if request.method=='POST':
        form=TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context={'tasks':tasks,'form':form}
    return render(request,'tasks/list.html',context)

def updateTask(request,pk):
    task=Task.objects.get(id=pk)
    form=TaskForm(instance=task)
    if request.method=='POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('/')
    context={'form':form}
    return render(request,'tasks/update_task.html',context=context)


def deleteTask(request,pk):
    item=Task.objects.get(id=pk)
    if request.method=='POST':
        item.delete()
        return redirect('/')
    context={'item':item}
    return render(request,'tasks/delete.html',context=context)

在这里插入图片描述

页面展示可以成功删除:
在这里插入图片描述

修改一下list的html页面:

<h3>TO DO</h3>
<form method="POST" action="/">
    {% csrf_token %}
    {{form}}
    <input type="submit" name="create Task">
</form>
{% for task in tasks %}
<div>
    <a href="{% url 'tasks:update_task' task.id %}">Update</a>
    <a href="{% url 'tasks:delete' task.id %}">Delete</a>
    {% if 'task.complete==True' %}
    <strike>{{task}}</strike>
    {% else %}
    <span>{{task}}</span>
    {% endif %}

</div>

{% endfor %}

在这里插入图片描述

完成的项目 在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

最终效果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值