Django基础第一篇

目录

1.Django MTV框架简介

2.基础命令创建项目的配置说明

3.前后端交互案例

4.基于数据库实现数据交互增删改查

Django简介

Django框架的设计模式借鉴了MVC的思想,和MVC不同的点是它拆分的三部分,分别为:(Model)模型、 (Template)模板、以及(View)视图

MVC和MTV知识点补充:

MVC是三个单词的首字母缩写,它们是Model模型、View视图 和Controller控制。

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外 壳。

2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

(ps:这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。)

Django的MTV

Model模型:负责对象与数据库对象(ORM)

Template模板:负责如何把页面展示给用户

View视图:负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view在调用相应的Model和Template

  

创建一个django项目

1.创建项目
django-admin startproject mysite

2.创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

3.启动项目python manage.py runserver  #默认使用8000端口

指定端口
python manage.py runserver 8888  #8888为新指定的端口
python manage.py runserver 127.0.0.1:8000  #还可以指定IP和端口,冒号分割

4.创建app
app01/
    migrations
        __init__.py
    __init__.py
    admin.py      #admin的配置
    apps.py       #
    models.py     #与数据库交互的时候用orm
    tests.py      #测试
    views.py      #写函数用

5.数据库迁移
python manage.py makemigrations
python manage.py migrate

6.创建超级用户
python manage.py createsuperuser

原理:创建好项目以后需要在setting里面做相应的配置,如果是通过命令创建的项目 那么需要自己额外的创建app(app主要用来写具体的功能),和templates(存放模板文件)

以下是登录密码成功后跳转到成功页面的小案例:1. python manage.py startapp app01   创建app01目录 创建完会自动生成相应的文件2.创建templates目录3.配置settings支持app01和Template
INSTALLED_APPS = [    ‘django.contrib.admin‘,    ‘django.contrib.auth‘,    ‘django.contrib.contenttypes‘,    ‘django.contrib.sessions‘,    ‘django.contrib.messages‘,    ‘django.contrib.staticfiles‘,    ‘app01.apps.App01Config‘,  #添加这行即可  直接引入类]
TEMPLATES = [    {        ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,        ‘DIRS‘: [os.path.join(BASE_DIR,"templates")],   #添加这一行,如果是pycharm创建的项目默认是ok的。        ‘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‘,            ],        },    },]
中间件注释csrf才能支持表单提交(测试使用)
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‘,]
添加mysql配置 第二个案例用,第一个案例不用跟mysql交互so 可直接忽略
import pymysqlpymysql.install_as_MySQLdb()   #一般放在settings同级的init文件中  DATABASES = {    ‘default‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘day14‘,        ‘HOST‘:"127.0.0.1",        "PORT":3306,        "USER":‘root‘,        "PASSWORD":‘wang‘,    }}

修改静态文件存放,为了以后规范化使用
STATIC_URL = ‘/static/‘   #相当于别名STATICFILES_DIRS = [    os.path.join(BASE_DIR,"static")]至此setting告一段落

实例:前后端交互简单案例1修改url分发器,相当于路由,把用户要执行的操作转发到app01下的views里面,当然函数写在哪儿都行but为了规范化写到views里面
from app01 import views 导入views模块

urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^login/‘, views.login),    url(r‘^index/‘, views.index)   写上具体的函数

]
views里面的代码逻辑
from django.shortcuts import render,redirect,HttpResponse

# Create your views here.def index(request):    return render(request,‘success.html‘)

def login(request):    if request.method == ‘POST‘:        user = request.POST.get(‘user‘)        pwd = request.POST.get(‘pwd‘)        if user == ‘admin‘ and pwd == ‘admin‘:            #用户登录成功            return redirect(‘/index/‘)        else:            return render(request, ‘login.html‘,{"error":"用户名或密码错误"})    return render(request,‘login.html‘)

模板文件login.html
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>登录</title></head><body><form action="" method="post">    <p>    <label for="username">用户名</label>        <input type="text" id="username" name="user">    </p>    <p>         <label for="password">密码</label>        <input type="password" id="password" name="pwd">    </p>    <p>        {{error}}    </p>    <input type="submit" value="登录"></form></body></html>

登录成功后重定向到这个目录下success.html
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <h1>        登录成功    </h1></body></html>

验证结果:

python manage.py runserver  启动项目

输入用户名密码正确后

否则

连接数据库后的操作

Django 使用mysql数据库配置
    1. 创建一个mysql数据库
    2. 在settings中配置数据库:
    3. 使用pymysql模块连接mysql数据库
        在与settings同级目录下的__init__.py中:
        import pymysql
        pymysql.install_as_MySQLdb()
    4. 创建表,在app下的models.py中写类:
            from django.db import models

            # Create your models here.
            class UserInfo(models.Model):
                username = models.CharField(max_length=32)  # varchar(32)
                password = models.CharField(max_length=32)         #注释表示删除

    5. 执行数据库迁移的命令
        python manage.py makemigrations  # 创建迁移文件  记录上models.py的变更记录
        python manage.py migrate          # 执行迁移数据库

orm具体操作:
ret = models.Publisher.objects.all() # 查询所有的数据 对象列表
for i in ret:
print(i,type(i)) # 对象 对应数据库一条数据
print(i.name,i.id) # 属性 字段的值


models.Publisher.objects.filter(name=publisher_name) 查不到就是空列表


models.Publisher.objects.create(name=publisher_name) 新增


models.Publisher.objects.filter(id=id).delete() 删除


修改
publisher_name = request.POST.get(‘publisher_name‘)
# 编辑
pub_obj.name = publisher_name # 只在内存中有变化
pub_obj.save() # 保存修改到数据库


模板
{% for pub in ret %}
<tr>
<td>{{ pub.id }}</td>
<td>{{ pub.name }}</td>
</tr>
{% endfor %}

基于数据库实现怎删改查操作实例

1. 查询在数据库读取数据然后在前端文件显示

models.py文件配置
from django.db import models

class Pulisher(models.Model):
    name = models.CharField(max_length=32)  #创建表和字段

python manage.py makemigrations
python manage.py migrate
完了在表里面自行添加几条记录为了展示效果

在url分发器添加执行的函数名
rlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^login/‘, views.login),
    url(r‘^index/‘, views.index),
    url(r‘^publisher_list/‘, views.publisher_list)  #名字对应views里面的函数名

views里面的函数逻辑
from app01 import models  #需要导入models模块,基于这个模块来实现后续操作
def publisher_list(request):
    ret = models.Pulisher.objects.all()
    # for i in ret:
    #     print(i,type(1))
    #     print(i.name,i.id)
    return render(request,‘publisher_list.html‘,{"ret":ret})

publisher_list.html模板文件配置
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>出版社列表</h1>
<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>名称</th>
    </tr>
    </thead>
    <tbody>
    {% for pub in ret %}
        <tr>
            <td>
            {{pub.id}}
            </td>
            <td>
            {{pub.name}}
            </td>
        </tr>

    {% endfor %}
    </tbody>
</table>
</body>
</html>

结果展示:

ps: 由于我建表的时候publisher_list少写了一个字母,所以后导入models模块的时候名字要一样,否则会报错。

2. 添加实例

models里面添加表

class Pulisher(models.Model):    name = models.CharField(max_length=32)

urls添加函数名
urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^login/‘, views.login),    url(r‘^index/‘, views.index),    url(r‘^publisher_list/‘, views.publisher_list),    url(r‘^add_publisher/‘, views.add_publisher)]

views里面写具体的实现逻辑,如果添加的字段存在提示即可,如果不存在则添加
def add_publisher(request):    if request.method == ‘POST‘:        publisher_name = request.POST.get("publisher_name")        ret = models.Pulisher.objects.filter(name=publisher_name)        if ret:            return render(request, "add_publisher.html",{"error":"出版社名称已存在"})

        models.Pulisher.objects.create(name=publisher_name)        return redirect("/publisher_list/")    return render(request,"add_publisher.html")

add_publisher.html 里面的代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><form action="" method="post">    <p>        <label for="">出版社名称</label>        <input type="text" name="publisher_name"><span>{{error}}</span>    </p>    <button>新增</button></form></body></html>

结果展示

添加不存在的直接添加并展示出添加后的结果

3.删除例子

urls添加函数名

urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^login/‘, views.login),    url(r‘^index/‘, views.index),    url(r‘^publisher_list/‘, views.publisher_list),    url(r‘^add_publisher/‘, views.add_publisher),    url(r‘^del_publisher/‘, views.del_publisher)]

views里面的函数逻辑
def del_publisher(request):    id = request.GET.get("id")           #这里的GET是url携带的参数    models.Pulisher.objects.filter(id = id).delete()    return redirect("/publisher_list/")

publisher_list.html 文件
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>出版社列表</h1><table border="1">    <thead>    <tr>        <th>ID</th>        <th>名称</th>        <th>操作</th>    </tr>    </thead>    <tbody>    {% for pub in ret %}        <tr>            <td>            {{pub.id}}            </td>            <td>            {{pub.name}}            </td>            <td><a href="/del_publisher/?id={{pub.id}}">删除</a></td>        </tr>    {% endfor %}    </tbody></table></body></html>验证结果:访问地址直接点击删除即可。
4.修改操作

urls添加函数
urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^login/‘, views.login),    url(r‘^index/‘, views.index),    url(r‘^publisher_list/‘, views.publisher_list),    url(r‘^add_publisher/‘, views.add_publisher),    url(r‘^del_publisher/‘, views.del_publisher),    url(r‘^edit_publisher/‘, views.edit_publisher),]

views里面函数逻辑
def edit_publisher(request):    id = request.GET.get("id")    pub_list = models.Pulisher.objects.filter(id=id)#拿到对象列表    print(pub_list)    pub_obj = pub_list[0]    print(pub_obj)

    if request.method == "POST":        publisher_name = request.POST.get("publisher_name")        pub_obj.name = publisher_name        pub_obj.save() #保存修改到数据库        return redirect("/publisher_list/")    return render(request,"edit_publisher.html",{"pub_obj":pub_obj})

publisher_list原有的基础上添加:
<a href="/edit_publisher/?id={{pub.id}}">编辑</a></td>
edit_publisher.html文件
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><form action="" method="post">    <p>        <label for="">出版社名称</label>        <input type="text" name="publisher_name" value="{{pub.obj.name}}"><span>{{error}}</span>    </p>    <button>保存</button></form></body></html>

完成!

原文地址:https://www.cnblogs.com/guniang/p/11188675.html

时间: 2024-10-31 12:38:26

Django基础第一篇的相关文章

Python Web框架【Django框架第一篇基础】

Django框架第一篇基础[DjangoMTV模式] 老师博客[www.cnblogs.com/yuanchenqi/articles/6811632.html] 同学博客:http://www.cnblogs.com/haiyan123/p/7701412.html Django官网:https://www.djangoproject.com/download/ 一.安装Django DjangoMTV模式 Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代

Django 【第一篇】基础

一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个URL分发器.它的作用是将一个个URL

Django框架第一篇基础

一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件   模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个URL分发器.它的作用是将一个个U

FFmpeg深入分析之零-基础 &lt;第一篇&gt;

FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒体基础知识,否则其源代码会非常晦涩难懂.本文将从介绍一些基本的多媒体只是,主要是为研读ffmpeg源代码做准备,比如一些编解码部分,只有真正了解了多媒体处理的基本流程,研读ffmpeg源代码才能事半功倍. 下面分析一下多媒体中最基本最核心的视频解码过程,平常我们从网上下载一部电影或者一首歌曲,那么相应的多媒体播放器为我们做好了一切工作,我们只用欣赏就ok了.目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffm

XML基础&lt;第一篇&gt;

一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基础: <?xml version="1.0" encoding="utf-8" ?> <books ISBN="9787544238212"> <title>xml学习笔记</title> <pr

CSS3基础第一篇(圆角,阴影,渐变,选择器)

1.border-radius:1px 2px 3px 2px;  /*添加圆角  四个半径值分别是左上角.右上角.右下角和左下角,顺时针 */ 2.box-shadow:0px 0px 12px 5px #33CC00 inset; /*添加阴影 参数分别是  X轴偏移量 Y轴偏移量  [阴影模糊半径] [阴影扩展半径][阴影颜色]  [投影方式]*/ a.阴影模糊半径与阴影扩展半径的区别 阴影模糊半径:此参数可选,其值只能是为正值,如果其值为0时,表示阴影不具有模糊效果,其值越大阴影的边缘就

黑马程序员--oc基础第一篇

一.oc的基础知识 1.oc的源代码的扩展名为:“.m” 2.不再用include了,改用#import<Foundation/foundation.h>,区别就是import自动检查是否包含了相同的头文件,不需要再在c语言中用IFDef了. 3.类的声明用@interface @end,将声明代码写在两部分之间. 4.BOOL 类型的实质为char typedef signed char BOOL: #define Yes (BOOL) 1 #define No (Bool) 0 5.在oc

django学习[第一篇]

01-创建Django项目 安装虚拟环境: mkvirtualenv django_demo -p python3 安装django安装包(联网安装): pip install django==2.2 -i https://pypi.douban.com/simple 创建django工程(项目): django-admin startproject 项目名称[目录名称] 例如: django-admin startproject django_demo 第一次创建项目以后的目录结构: djan

JavaSE基础第一篇

1.JDK的安装: 包括JRE 和JVM 下载地址: www.oracle.com/www.sun.com 2.环境变量 set path = "bin所在路径" 设置path环境变量: 方便找到要启动的应用程序 环境变量 path="bin路径" path_home ? 方便对java/bin路径的修改 path(path_home引入path) ;%%JAVA_HOME%/bin; 绿色版与安装版 绿色版:可以其他文件夹,可以正常使用 安装版 3. java的特