zoukankan      html  css  js  c++  java
  • s10_part3_django_basic.md

    s10_part3_django_basic

    返回顶部

    django安装

    mkdir -p ~/PycharmProjects/project/Django2.0
    cd ~/PycharmProjects/project/Django2.0
    virtualenv mysite-env
    source mysite-env/bin/activate
    pip install django==1.11.11
    pip list
    deactivate #退出虚拟环境
    

    startproject

    django-admin startproject mysite
    tree mysite
    
    mysite/
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    
    

    返回顶部

    初识mysite.mysite.urls.py

    cat urls.py

    from django.conf.urls import url
    from django.contrib import admin
    
    #为了避免自己写http协议的socket,这里直接引用 django的HttpResponse
    from django.shortcuts import HttpResponse
    
    def test_url(request):  #自定义一个函数,request代表所有的http请求,可以是任务字符,通常习惯上使用request
        return HttpResponse("hello world!")   #返回一串字符
    
    
    urlpatterns = [
        # url(r'^admin/', admin.site.urls),
        url(r'^test_url/', test_url),
    ]
    
    

    返回顶部

    启动django服务器

    命令行中输入python manage.py runserver //启动服务器
    再浏览器中输入:http://127.0.0.1:8000/test_url/
    即可到返回的字符串:hello world!

    配置 mysite.mysite.settings.py

    settings.py中默认存在:BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    所有的html相关文件的设置都在这里
    注意:填写DIRS采用这种内置函数的方式   'DIRS': [os.path.join(BASE_DIR,'templates')],
    不要使用字符串拼接,因为不确定运行的操作系统的路径分隔符
    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',
                ],
            },
        },
    ]
    

    所以在BASEDIR(即这里的mysite)下新建一个文件夹templates,然后将html文件放置于这个文件夹中即可

    使用render返回网页

    cat urls.py

    from django.conf.urls import url
    from django.contrib import admin
    
    #为了避免自己写http协议的socket,这里直接引用 django的HttpResponse
    from django.shortcuts import HttpResponse, render
    
    def test_url(request):  #自定义一个函数,request代表所有的http请求,可以是任务字符,通常习惯上使用request
        return HttpResponse("hello world!")   #返回一串字符
    
    
    def test_url2(request):
        return render(request,"url2.html")  #返回html文件
    
        #如果url2.html的位置是在templates下的某一个文件夹XX
        #那么改为:return render(request,"xx/url2.html") 即可
    
    
    # 返回渲染的html与以下读取文件,返回字符串的效果相同
    def test_url3(request):
        # with open("xx/url2.html",'rb') as f:   #等价于下一写法
        with open("xx/url2.html",'r',encoding='utf-8') as f:
            data = f.read()
        return HttpResponse(data)
    
    
    
    urlpatterns = [
        # url(r'^admin/', admin.site.urls),
        url(r'^test_url/', test_url),   #前面部分为访问的url,后面为调用的函数名
        url(r'^test_url2/', test_url2),
        url(r'^test_url3/', test_url3),
    ]
    
    

    返回顶部

    startapp

    为了代码的模块化,功能化,维护更便捷,因此采用django app的方式构建整个项目
    在开启一个项目后后根据功能模块创建django APP,这里创建一个名为library的app

    cd mysite
    python manage.py startapp library
    
    tree ../mysite
    mysite/
    ├── library
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    
    
    

    返回顶部

    注册已创建的django APP

    vim mysite.mysite.settings.py

    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # 'library', 此种写法与下面效果一样,二选其一,但推荐下面一种写法
        'library.apps.LibraryConfig'  #推荐的写法
    ]
    
    

    配置连接MySQL数据库

    django不能自动创建数据库,因此需要手动创建数据库

    mysql -u root -p -H $host -P $port
    create database mysite default charset utf8;
    show databases;
    

    配置连接MySQL数据库
    vim mysite.mysite.settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'USER':'root',
            'PASSWORD':'Pw123456',
            'NAME': 'mysite',
        }
    }
    

    返回顶部

    使用pymysql连接数据库

    这里设置django中使用pymysql代替默认使用的MySQLdb连接数据库
    修改mysite.mysite.init.py

    import pymysql
    pymysql.install_as_MySQLdb()
    

    在开发环境中安装pymysql:

    pip3 install pymysql
    

    在django app下的models.py中定义类

    这个类必须继承models.Model
    mysite.library.models.py

    from django.db import models
    
    #每个类分别对应数据库中的表,每个属性对应为表中字段,数据表中的第条记录对应为类的一个实例化对象
    # Create your models here.
    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)  #创建一个自增的字段,并设置为主键
        name = models.CharField(null=False,max_length=20)  #创建一个varchar类型的字段,不能为空,最多20个字符串
    
    

    返回顶部

    使用ORM执行SQL命令

    在项目根目录下执行

    python3 manage.py makemigrations
    python3 manage.py migrate
    
    

    展示用户列表

    在mysite.mysite.urls.py中增加以下内容

    from library import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^user_list/', views.user_list),
    ]
    
    

    在mysite.library.views.py中增加以下内容

    from django.shortcuts import render
    from library import models
    
    
    # Create your views here.
    
    # 展示所有用户的的函数
    def user_list(request):
        # 取出所有数据,实列化为每个相应的对象,放入一个列表中
        # order_by("id")可以使查询的数据以ID从小到大排序
        ret = models.UserInfo.objects.all().order_by("id")
        # print(ret)
        # print(ret[0].id, ret[0].name)  #提取每个对应的属性值打印到控制台
        # 传一个字典给网页模板,模板渲染后展示给用户
        return render(request, "user_list.html", {"user_list": ret})
    
    
    

    在mysite.templates目录下,创建user_list.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>user list</title>
    </head>
    <body>
    <table border="1">
        <tr>
            <th>序号</th>
            <th>id值</th>
            <th>姓名</th>
        </tr>
        <tbody>
        {% for user in user_list %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ user.id }}</td>
            <td>{{user.name}}</td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
    </body>
    </html>
    

    返回顶部

    添加用户

    在mysite.mysite.urls.py中的urlpatterns里增加以下内容

        url(r'^add_user/', views.add_user),
    
    

    在mysite.library.views.py中增加以下内容

    from django.shortcuts import render, HttpResponse,redirect
    
    # 添加用户的函数
    def add_user(request):
        if request.method == 'POST':
            # 用户填写了新的用户名,并发送了POST请求过来
            new_name = request.POST.get("username", None)
            # 用数据库中创建一条用户记录
            models.UserInfo.objects.create(name=new_name)
            # 返回添加成功
            # return HttpResponse("添加成功")
            # 或者返回用户展示页面
            return redirect("/user_list/")
        # 第一个请求页面时,返回一个页面,页面上有个框让用户填写需要新建的用户名
        return render(request, "add_user.html")
    
    

    在mysite.templates目录下,创建add_user.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加用户</title>
    </head>
    <body>
    <form action="/add_user/" method="post">
        <p>username:
            <input type="text" name="username">
        </p>
        <p>
            <input type="submit" value="提交">
        </p>
    </form>
    </body>
    </html>
    
    

    修改mysite.templates.user_list.html,增加添加用户的超链接入口

    <body>
    <!--在user_list面面添加以下添加用户的超链接即可-->
    <a href="/add_user/">添加用户</a>
    
    <table border="1">
    <!--以下HTML省略未粘贴-->
    
    

    返回顶部

    删除用户

    在mysite.mysite.urls.py中的urlpatterns里增加以下内容

        url(r'^delete_user/', views.delete_user),
    

    在mysite.library.views.py中增加以下内容

    # 删除用户的函数
    def delete_user(request):
        # 删除指定数据
        # 从GET请求参数里面拿到将要删除的数据的ID值
        del_id = request.GET.get("id", None)
        # 如果取到了ID值
        if del_id:
            # 根据这个ID值去数据库找到数据对象
            del_obj = models.UserInfo.objects.get(id=del_id)
            # 调用该对象的delete方法删除数据对象
            del_obj.delete()
            # 返回删除后的用户展示页面
            return redirect("/user_list/")
        else:
            return HttpResponse("要删除的数据不存在!")
    
    

    修改mysite.templates.user_list.html,增加删除用户的超链接入口

    <body>
    <!--在user_list面面添加以下添加用户的超链接即可-->
    <a href="/add_user/">添加用户</a>
    <table border="1">
        <tr>
            <th>序号</th>
            <th>id值</th>
            <th>姓名</th>
            <th>操作</th>
        </tr>
        <tbody>
        {% for user in user_list %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ user.id }}</td>
            <td>{{user.name}}</td>
            <!--在user_list面面增加以下删除用户的超链接即可-->
            <td><a href="/delete_user/?id={{user.id}}">删除</a></td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
    </body>
    
    

    返回顶部

    编辑用户

    在mysite.mysite.urls.py中的urlpatterns里增加以下内容

        url(r'^edit_user/', views.edit_user),
    

    在mysite.library.views.py中增加以下内容

    # 编辑用户的函数
    def edit_user(request):
        error_msg = ""
        # 用户修改完用户名,点击提交按钮,发送给服务器新的用户名
        if request.method == "POST":
            # print(request.POST) #打印POST的数据到控制台
            # 取出用户的ID,新的用户名
            edit_id = request.POST.get("id", None)
            new_name = request.POST.get("username", None)
            # 根据ID取到要编辑的用户对象
            edit_obj = models.UserInfo.objects.get(id=edit_id)
            edit_obj.name = new_name
            edit_obj.save()  # 将修改提交到数据数据库保存
            # 跳转到用户展示页面,查看是否修改成功
            return redirect("/user_list/")
    
        edit_id = request.GET.get("id", None)
        if edit_id:
            # 获取当前编辑的用户对象
            edit_obj = models.UserInfo.objects.get(id=edit_id)
            return render(request, "edit_user.html", {"user": edit_obj})
        else:
            error_msg="编辑的用户不存在!"
            return render(request,"edit_user.html", {"err_msg":error_msg})
    
    
    

    在mysite.templates目录下,创建edit_user.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>编辑用户</title>
    </head>
    <body>
    <h1>编辑姓名</h1>
    <form action="/edit_user/" method="post">
        <p><input type="text" name="id" value="{{ user.id }}" style="display:none"></p>
        <p><input type="text" name="username" value="{{ user.name }}"></p>
        <p><input type="submit" value="提交" ></p>
        <p>{{err_msg}}</p>
    </form>
    </body>
    </html>
    
    

    附:

    ## 静态文件配置项STATICFILES_DIRS

    默认此项配置位于settings.py的最后

    #此项是静态文件保存目录的别名,这个static就代表了下面STATICFILES_DIRS列表中的所有路径
    #因此在html中引用static下的CSS文件时,只需要写static/path/to/css/file即可
    STATIC_URL = '/static/'
    
    #添加如下静态文件项,将所有的静态文件(js,css,images)都放在下面配置的路径中
    
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,"static_library")
    os.path.join(BASE_DIR,"static_test")
    ]
    
    

    例如:

    static_illustration

    pycharm连接MySQL工具的使用

    1.在pycharm菜单栏上点[Views],然后勾选[Tool Button]
    2.在窗口最右边出现ToolButtion的工具栏,选Database栏
    3.依次点[+]->[Data Source]
    4.在弹出窗口中填写相应的MySQL数据库的信息
    5.初次使用时,需要下载驱动,即:点击下方的[Download missing driver files]
    6.点[OK]后,即可可视化操作MySQL的数据库

    帮助命令

    
    python manage.py help //查看帮助命令
    python manage.py migrate //初始化默认数据库
    python manage.py createsuperuser //创建超级管理员
    
    
  • 相关阅读:
    HTTP方法(转)(学习基础)
    正则表达式 学习手记 111221
    原型模式 学习手记
    分布式事务 MSDTC配置
    Ibatis.Net 学习手记二 缓存
    IIS 7.0 部署MVC
    事务与分布式事务
    Ibatis+MVC 3.0 开发手记
    Ibatis.Net 学习手记一 简单的Demo
    简单工厂 学习手记
  • 原文地址:https://www.cnblogs.com/rootid/p/9814042.html
Copyright © 2011-2022 走看看