zoukankan      html  css  js  c++  java
  • 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.启动项目
    p
    ython 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 pymysql
    pymysql.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>

    完成!
    We are down, but not beaten. tested but not defeated.
  • 相关阅读:
    1.2 进位运算 & 数据类型 & 变量
    phpcms 下载数统计
    mysql 手动安装
    php 位运算权限问题
    php foreach详解
    文字溢出问题
    webstrom 基本设置
    DEDE利用Ajax实现调用当前登录会员的信息简要说明
    windows服务器
    DedeCms密码解密
  • 原文地址:https://www.cnblogs.com/guniang/p/11188675.html
Copyright © 2011-2022 走看看