zoukankan      html  css  js  c++  java
  • Django入门

    以“图书-英雄”的管理为示例,使用Django完成基本流程的开发,学习Django的主要知识。

    安装Django

    pip install django
    

    说明:使用pip install django命令进行安装时,会自动删除旧版本,再安装新版本

    创建项目

    命令:django-admin startproject test1

    说明:上面命令中"test1"为你所需要创建的项目名

    进入test1目录,目录结构如下:

    说明:

    • manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
    • test1:项目真正的Python包
    • __init__.py:一个空文件,Python包所必需的文件
    • settings.py:项目的配置文件
    • urls.py:项目的URL声明
    • wsgi.py:项目与WSGI兼容的Web服务器入口

    设计介绍

    本项目完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄

    图书表结构设计:

      表名:BookInfo

      图书名称:btitle

      图书发布时间:bpub_date

    英雄表结构设计:

      表名:HeroInfo

      英雄姓名:hname

      英雄性别:hgender

      英雄简介:hcontent

      所属图书:hbook

    图书-英雄的关系为一对多

    数据库配置

    在settings.py文件中,通过DATABASES项进行数据库设置

    # Database
    # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    

    Django支持的数据包括:sqlite、mysql等主流数据库

    Django默认使用sqlite数据库

    创建应用

    在一个项目可以创建一到多个应用,每个应用进行一种业务处理

    创建应用的命令:python manage.py startapp booktest

    说明:上面命令中的"booktest"为你所需创建的应用名

    应用的目录结构如下:

    定义模型端

      有一个数据表,就有一个模型类与之对应

      打开models.py文件,定义模型类

      引入包from django.db import models

      模型类继承自models.Model类

      说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长

      当输出对象时,会调用对象的str方法

    # booktest/models.py
    from django.db import models
    
    """
    图书表结构设计:
    表名:BookInfo
    图书名称:btitle
    图书发布时间:bpub_date
    英雄表结构设计:
    表名:HeroInfo
    英雄姓名:hname
    英雄性别:hgender
    英雄简介:hcontent
    所属图书:hbook
    图书-英雄的关系为一对多
    """
    # Create your models here.
    # 图书类
    class BookInfo(models.Model):
        btitle = models.CharField(max_length = 20)
        bpub_date = models.DateTimeField()
    
        def __str__(self):
            return self.btitle
    
    # 英雄类
    class HeroInfo(models.Model):
        hname = models.CharField(max_length = 20)
        hgender = models.NullBooleanField()
        hcontent = models.CharField(max_length = 1000)
        hbook = models.ForeignKey('BookInfo')
    
        def __str__(self):
            return self.hname
    

    生成数据表

      激活模型:编辑settings.py文件,将booktest应用加入到INSTALLED_APPS中

    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'booktest',
    ]
    

      生成迁移文件:根据撒高端生成sql语句:python manage.py makemigrations

      迁移文件生成到应用的migrations目录中

      

      执行迁移:执行sql语句生成数据表:python manage.py migrate

    测试数据操作

      进入python shell,进行简单的模型API练习:python manage.py shell

      进入shell后提示如下:

      

      # 引入需要的包:

      from booktest.models import BookInfo, HeroInfo

      from datetime import *

      # 新建图书信息

      b = BookInfo()

      b.btitle = "射雕英雄传"

      b.bpub_date = datetime(year = 1990, month = 1, day = 10)

      b.save()

      # 查询所有图书信息:

      BookInfo.objects.all()

      # 根据条件查询图书信息(pk为主键)

      b = BookInfo.objects.get(pk = 1)

      # 输出图书信息

      b

      b.id

      b.btitle

      # 修改图书信息

      b.btitle = "天龙八部"

      b.save()

      # 删除图书信息

      b.delete()

    关联对象的操作

      对于HeroInfo可以按照上面的操作方式进行

      添加,注意添加关联对象

      h = HeroInfo()

      h.htitle = "郭靖"

      h.hgender = True

      h.hcontent = "降龙十八掌"

      h.hbook = b

      h.save()

    服务器

    运行如下命令可以开户服务器:python manage.py runserver ip:port

    说明:

      可以不写ip,默认端口为8000

      这是一个纯python编写的轻量级web服务器,仅在开发阶段使用

      服务器成功启动后,提示如下信息

      

      默认端口是8000,可以修改端口:python manage.py runserver 8080

      打开浏览器,输入网址“127.0.0.1:8000”就可以打开默认页面了

      通过CTRL+C停止服务器运行

    管理操作

    站点分为“内容发布”和“公共访问”两个部分

    “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。为此,Django会根据定义的模型类完全自动地生成管理模块。

    使用Django管理

    创建一个管理员用户:python manage.py createsuperuser

    然后按提示信息输入用户名、邮箱、密码

    启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录

    进入管理站点,默认可以对groups(组)、users(用户)进行管理

    管理界面本地化

    编辑settings.py文件,设置编码、时区

    LANGUAGE_CODE = 'zh-Hans'#'en-us'
    
    TIME_ZONE = 'Asia/Shanghai'#'UTC'
    

    向admin注册booktest模型

    打开booktest/admin.py文件,注册模型

    from django.contrib import admin
    from .models import BookInfo, HeroInfo
    # Register your models here.
    
    # 注册
    admin.site.register(BookInfo)
    admin.site.register(HeroInfo)
    

    刷新管理页面,可以对BookInfo的数据进行增、删、改、查等操作

    自定义管理页面

    from django.contrib import admin
    from .models import BookInfo, HeroInfo
    # Register your models here.
    
    # HeroInfo采用关联注册
    class HeroInfoInline(admin.TabularInline):
        model = HeroInfo
        extra = 2
    
    # BookInfo管理类
    class BookInfoAdmin(admin.ModelAdmin):
        # 列表页属性
        # 显示字段:可以点击列头进行排序
        list_display = ['pk', 'btitle', 'bpub_date']
        # 过滤字段:过滤框会显示在右侧
        list_filter = ['btitle']
        # 搜索字段:搜索框会出现在左上侧
        search_fields = ['btitle']
        # 分页:分页框会出现在左下侧
        list_per_page = 10
        # 添加、修改页属性
        # 属性的先后顺序
        # fields = ['bpub_date', 'btitle']
        # 属性分组
        fieldsets = [
            ('basic', {'fields': ['btitle']}),
            ('more', {'fields': ['bpub_date']})
        ]
    
        # 关联
        inlines = [HeroInfoInline]
    
    # 注册
    admin.site.register(BookInfo, BookInfoAdmin)
    admin.site.register(HeroInfo)
    

    视图

    在Django中,视图对web请求进行回应

    视图接收request对象作为第一个参数,包含了请求的信息

    视图就是一个Python函数,被定义在views.py中

    from django.http import HttpResponse
    
    # Create your views here.
    
    def index(request):
    
        return HttpResponse("index")
    
    def detail(request, bid):
    
        return HttpResponse("detail %s" % bid)
    

    定义完视图后,需要配置URLconf,否则无法处理请求

    URLconf

    在Django中,定义URLconf包括正则表达式、视图两个部分

    Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图

    注意:只匹配路径部分,即除去域名、参数后的字符串

    test1/urls.py

    from django.conf.urls import url, include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^', include('booktest.urls')),
    ]
    

    booktest/urls.py

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    """
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    作者:mayi
    博客:http://www.cnblogs.com/mayi0312/
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    """
    
    from django.conf.urls import url
    from .import views
    
    urlpatterns = [
        url(r'^$', views.index),
        url(r'^bid=(d+)', views.detail),
    ]
    

    模板

    模板是html页面,可以根据视图中传递的数据填充值

    创建模板的目录如下图:

    修改settings.py文件,设置TEMPLATES的DIRS值

    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',
                ],
            },
        },
    ]
    

    在模板中访问视图传递的数据

    {{输出值,可以是变量,也可以是对象.属性}}
    {%执行代码段%}
    

    定义index.html模板

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
    <B>图书列表</B>
    <ul>
        {%for book in book_list%}
        <li><a href="bid={{book.id}}">{{book.btitle}}</a></li>
        {%endfor%}
    </ul>
    </body>
    </html>
    

    定义detail.html模板

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>详情页</title>
    </head>
    <body>
    <B>{{book_title}}:英雄列表</B>
    <ul>
        {%for hero in hero_list%}
        <li>{{hero.hname}}</li>
        {%endfor%}
    </ul>
    </body>
    </html>
    

    使用模板

     编辑views.py文件,在方法中调用模板

    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import BookInfo, HeroInfo
    
    # Create your views here.
    
    def index(request):
        book_list = BookInfo.objects.all()
        context = {'book_list': book_list}
    
        # return HttpResponse("index")
        return render(request, 'index.html', context = context)
    
    def detail(request, bid):
        book = BookInfo.objects.get(pk = bid)
        hero_list = book.heroinfo_set.all()
        context = {'book_title': book.btitle, 'hero_list': hero_list}
    
        # return HttpResponse("detail %s" % bid)
        return render(request, 'detail.html', context = context)
    

    总结

    1. 安装配置Django运行的环境
    2. 编写模型,使用简单API与数据库交互
    3. 使用Django的后台管理中维护数据
    4. 通过视图接收请求,通过模型获取数据,展示出来
    5. 调用模板完成展示
  • 相关阅读:
    padding magin 盒子模型
    background元素背景--font字体
    border 边框
    浅析mvvm模式和mvc模式的区别和联系
    Win10下小米路由器4A百兆版刷Openwrt固件【图片详细版】
    Vue源码-手写mustache源码
    微信小程序支付实现流程
    Fiddler对安卓模拟器中的app抓包
    Niginx中Vue Router 历史(history)模式的配置
    ES6中Promise方法详解
  • 原文地址:https://www.cnblogs.com/mayi0312/p/7278906.html
Copyright © 2011-2022 走看看