Live2D

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. 调用模板完成展示

 

posted @ 2017-08-03 11:51  骑着螞蟻流浪  阅读(371)  评论(0编辑  收藏  举报