Django开发流程及实例

创建虚拟环境

创建:mkvirtualenv [虚拟环境名称]
删除:rmvirtualenv [虚拟环境名称]
进入:workon [虚拟环境名称]
退出:deactivate
所有的虚拟环境,都位于/home/.virtualenvs目录下

进入虚拟环境前的提示:

进入虚拟环境后的提示:

查看当前的所有虚拟环境:workon [两次tab键]

查看虚拟环境中已经安装的包

pip list
pip freeze

安装django

  • 建议安装1.8.2版本,这是一个稳定性高、使用广、文档多的版本
pip install django==1.8.2
  • 查看版本:进入python shell,运行如下代码
import django
django.get_version()
  • 说明:使用pip install django命令进行安装时,会自动删除旧版本,再安装新版本

创建项目

  • 命令:

    django-admin startproject test1
  • 进入test1目录,目录结构如下图:

目录说明

manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
内层的目录:项目的真正的Python包
_init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包
settings.py:项目的配置
urls.py:项目的URL声明
wsgi.py:项目与WSGI兼容的Web服务器入口

设计介绍

  • 本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
  • 图书表结构设计:
    • 表名:BookInfo
    • 图书名称:btitle
    • 图书发布时间:bpub_date
  • 英雄表结构设计:
    • 表名:HeroInfo
    • 英雄姓名:hname
    • 英雄性别:hgender
    • 英雄简介:hcontent
    • 所属图书:hbook
  • 图书-英雄的关系为一对多

数据库配置

  • 在settings.py文件中,通过DATABASES项进行数据库设置
  • django支持的数据库包括:sqlite、mysql等主流数据库
  • Django默认使用SQLite数据库

创建应用

  • 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
  • 创建应用的命令:
python manage.py startapp booktest
  • 应用的目录结构如下图

定义模型类

  • 有一个数据表,就有一个模型类与之对应
  • 打开models.py文件,定义模型类
  • 引入包from django.db import models
  • 模型类继承自models.Model类
  • 说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长
  • 当输出对象时,会调用对象的str方法
from django.db import models

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField()
    def _ _str_ _(self):
        return "%d" % self.pk

class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField()
    hcontent = models.CharField(max_length=100)
    hBook = models.ForeignKey(‘BookInfo‘)
    def _ _str_ _(self):
        return "%d" % self.pk

生成数据表

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

  • 生成迁移文件:根据模型类生成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 django.utils import timezone
from datetime import *
  • 查询所有图书信息:
BookInfo.objects.all()
  • 新建图书信息:
b = BookInfo()
b.btitle="射雕英雄传"
b.bpub_date=datetime(year=1990,month=1,day=10)
b.save()
  • 查找图书信息:
b=BookInfo.objects.get(pk=1)
  • 输出图书信息:
b
b.id
b.btitle
  • 修改图书信息:
b.btitle=u"天龙八部"
b.save()
  • 删除图书信息:
b.delete()

关联对象的操作

  • 对于HeroInfo可以按照上面的操作方式进行
  • 添加,注意添加关联对象
h=HeroInfo()
h.htitle=u‘郭靖‘
h.hgender=True
h.hcontent=u‘降龙十八掌‘
h.hBook=b
h.save()
  • 获得关联集合:返回当前book对象的所有hero
b.heroinfo_set.all()
  • 有一个HeroInfo存在,必须要有一个BookInfo对象,提供了创建关联的数据:
h=b.heroinfo_set.create(htitle=u‘黄蓉‘,hgender=False,hcontent=u‘打狗棍法‘)


服务器

  • 运行如下命令可以开启服务器
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‘
TIME_ZONE = ‘Asia/Shanghai‘

向admin注册booktest的模型

  • 打开booktest/admin.py文件,注册模型
from django.contrib import admin
from models import BookInfo
admin.site.register(BookInfo)
  • 刷新管理页面,可以对BookInfo的数据进行增删改查操作
  • 问题:如果在str方法中返回中文,在修改和添加时会报ascii的错误
  • 解决:在str()方法中,将字符串末尾添加“.encode(‘utf-8‘)”

自定义管理页面

  • Django提供了admin.ModelAdmin类
  • 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式
class QuestionAdmin(admin.ModelAdmin):
    ...
admin.site.register(Question, QuestionAdmin)
列表页属性
  • list_display:显示字段,可以点击列头进行排序
list_display = [‘pk‘, ‘btitle‘, ‘bpub_date‘]
  • list_filter:过滤字段,过滤框会出现在右侧
list_filter = [‘btitle‘]
  • search_fields:搜索字段,搜索框会出现在上侧
search_fields = [‘btitle‘]
  • list_per_page:分页,分页框会出现在下侧
list_per_page = 10
添加、修改页属性
  • fields:属性的先后顺序
fields = [‘bpub_date‘, ‘btitle‘]
  • fieldsets:属性分组
fieldsets = [
    (‘basic‘,{‘fields‘: [‘btitle‘]}),
    (‘more‘, {‘fields‘: [‘bpub_date‘]}),
]

关联对象

  • 对于HeroInfo模型类,有两种注册方式

    • 方式一:与BookInfo模型类相同
    • 方式二:关联注册
  • 按照BookInfor的注册方式完成HeroInfo的注册
  • 接下来实现关联注册
from django.contrib import admin
from models import BookInfo,HeroInfo

class HeroInfoInline(admin.StackedInline):
    model = HeroInfo
    extra = 2

class BookInfoAdmin(admin.ModelAdmin):
    inlines = [HeroInfoInline]

admin.site.register(BookInfo, BookInfoAdmin)
  • 可以将内嵌的方式改为表格
class HeroInfoInline(admin.TabularInline)

布尔值的显示

  • 发布性别的显示不是一个直观的结果,可以使用方法进行封装
def gender(self):
    if self.hgender:
        return ‘男‘
    else:
        return ‘女‘
gender.short_description = ‘性别‘
  • 在admin注册中使用gender代替hgender
class HeroInfoAdmin(admin.ModelAdmin):
    list_display = [‘id‘, ‘hname‘, ‘gender‘, ‘hcontent‘]
 

视图

  • 在django中,视图对WEB请求进行回应
  • 视图接收reqeust对象作为第一个参数,包含了请求的信息
  • 视图就是一个Python函数,被定义在views.py中
#coding:utf-8
from django.http import HttpResponse

def index(request):
    return HttpResponse("index")
def detail(request,id):
    return HttpResponse("detail %s" % id)
  • 定义完成视图后,需要配置urlconf,否则无法处理请求

URLconf

  • 在Django中,定义URLconf包括正则表达式、视图两部分
  • Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图
  • 注意:只匹配路径部分,即除去域名、参数后的字符串
  • 在test1/urls.py插入booktest,使主urlconf连接到booktest.urls模块
url(r‘^‘, include(‘booktest.urls‘)),
  • 在booktest中的urls.py中添加urlconf
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r‘^$‘, views.index),
    url(r‘^([0-9]+)/$‘, views.detail),
]
 

模板

  • 模板是html页面,可以根据视图中传递的数据填充值
  • 创建模板的目录如下图:

  • 修改settings.py文件,设置TEMPLATES的DIRS值
‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)],
  • 在模板中访问视图传递的数据
{{输出值,可以是变量,也可以是对象.属性}}
{%执行代码段%}

定义index.html模板

<!DOCTYPE html>
<html>
<head>
  <title>首页</title>
</head>
<body>
<h1>图书列表</h1>
<ul>
{%for book in booklist%}
<li>
  <a href="{{book.id}}">
    {{book.btitle}}
  </a>
</li>
{%endfor%}
</ul>
</body>
</html>

定义detail.html模板

  • 在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号
<!DOCTYPE html>
<html>
<head>
  <title>详细页</title>
</head>
<body>
<h1>{{book.btitle}}</h1>
<ul>
  {%for hero in book.heroinfo_set.all%}
  <li>{{hero.hname}}---{{hero.hcontent}}</li>
  {%endfor%}
</ul>
</body>
</html>

使用模板

  • 编辑views.py文件,在方法中调用模板
from django.http import HttpResponse
from django.template import RequestContext, loader
from models import BookInfo

def index(request):
    booklist = BookInfo.objects.all()
    template = loader.get_template(‘booktest/index.html‘)
    context = RequestContext(request, {‘booklist‘: booklist})
    return HttpResponse(template.render(context))

def detail(reqeust, id):
    book = BookInfo.objects.get(pk=id)
    template = loader.get_template(‘booktest/detail.html‘)
    context = RequestContext(reqeust, {‘book‘: book})
    return HttpResponse(template.render(context))

去除模板的硬编码

  • 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/”
<a href="{{book.id}}">
  • 看如下情况:将urlconf中详细页改为如下,链接就找不到了
url(r‘^book/([0-9]+)/$‘, views.detail),
  • 此时的请求地址应该为“127.0.0.1/book/1/”
  • 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效
  • 解决:使用命名的url设置超链接
  • 修改test1/urls.py文件,在include中设置namespace
url(r‘^admin/‘, include(admin.site.urls, namespace=‘booktest‘)),
  • 修改booktest/urls.py文件,设置name
url(r‘^book/([0-9]+)/$‘, views.detail, name="detail"),
  • 修改index.html模板中的链接
<a href="{%url ‘booktest:detail‘ book.id%}">

Render简写

  • Django提供了函数Render()简化视图调用模板、构造上下文
from django.shortcuts import render
from models import BookInfo

def index(reqeust):
    booklist = BookInfo.objects.all()
    return render(reqeust, ‘booktest/index.html‘, {‘booklist‘: booklist})

def detail(reqeust, id):
    book = BookInfo.objects.get(pk=id)
    return render(reqeust, ‘booktest/detail.html‘, {‘book‘: book})

原文地址:https://www.cnblogs.com/fwl8888/p/9345573.html

时间: 2024-11-07 23:06:54

Django开发流程及实例的相关文章

ThinkPHP创建应用的一般开发流程及实例

使用ThinkPHP框架快速开发网站(多图):https://blog.csdn.net/ruby97/article/details/7574851 Thinkphp是免费开源的php框架,提供了建站所需要的各种组件,方便用户快速建设部署网站. Thinkphp简介:http://thinkphp.cn/Manual/16 官方完全开发手册:http://thinkphp.cn/Manual 使用 ThinkPHP 创建应用的一般开发流程是: ? 创建数据库和数据表:(没有数据库操作可略过)

Django学习-----Django开发流程

1. 安装django Django的下载地址:https://www.djangoproject.com/download/ 解压缩后进入这个目录,执行python setup.py install 2. 测试 #python #import python 没有出现错误,证明安装成功 3.创建django项目 #django-admin.py startproject  web_01 4. 修改settings.py 修改TIME_ZON为  Asia/Shanghai 修改LANGUAGE_

Django开发流程

1.创建Django工程 django-admin startproject pro1 2.settings.py配置中文和时区,和在pro1根目录下创建一个'static'目录,并在settings.py中配置静态文件指向(找到相应的地方进行修改) LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai' USE_TZ = False # 不用默认(时间如插入时间一致) # 设置静态文件指向(添加以下代码) STATICFILES_DIRS =

django开发环境搭建(参考流程)

django开发环境搭建(参考流程) 2013-08-08 01:09:06 分类: LINUX 原文地址:django开发环境搭建(参考流程) 作者:bailiangcn 对于一个初学者,在实际的开发环境中,应该采用什么的样的工具来开发django呢? 我想环境至少应该具备的特性有: 多版本python环境的支持 版本控制 自动测试框架 数据库支持迁移 部署的自动化 参考文档 主要参考的文档-英文 virtualenv介绍 VirtualEnv 和Pip 构建Python的虚拟工作环境 使用V

Django (九) 项目开发流程&amp;项目架构

项目开发流程&项目架构 1. 软件开发的一般流程 1. 需求分析及确认: 由需求分析工程师与客户确认甚至挖掘需求.输出需求说明文档. ? 2. 概要设计及详细设计: 开发对需求进行概要设计,包括系统的基本处理流程,组织结构.模块划分.接口设计.数据库结构设计等.然后在概要设计的基础上进行详细设计.详细设计中描述实现具体模块所涉及到的主要算法.数据结构.类的层次结构及调用关系,需要说明软件系统各个层次中的每一个程序(每个模块或子程序)的设计考虑,以便进行编码和测试.基本达到伪代码的层面. (原型图

vue项目搭建和开发流程 vue项目配置ElementUI、jQuery和Bootstrap环境

目录 一.VUE项目的搭建 1. 环境搭建 2. 项目的创建和启动 二. 开发项目 1. 配置vue项目启动功能 2. 开发vue项目 (1)项目文件的作用 (2)vue项目开发流程 (3)vue项目的请求生命周期 三.vue项目中的功能 1. 路由相关的标签和方法 2. 路由配置 (1)无路由传参的路由配置方法 (2)路由传参的路由配置方法 3. 页面的跳转功能 (1)标签跳转 (2)逻辑跳转(路由跳转) 四.JS原型 五.vue组件生命周期钩子 六.vue的ajax插件:axios 七.vu

软件开发流程(转载)

软件开发流程 迭代化软件开发技术 1. 传统开发流程的问题 传统的 软件开发流程是一个文档驱动的流程,它将整个软件开发过程划分为顺序相接的几个阶段,每一个阶段都必需完毕所有规定的任务(文档)后才可以进入下一个阶段. 如必须完毕所有的系统需求规格说明书之后才可以进入概要设计阶段,编码必需在系统设计完毕之后才可以进行.这就意味着仅仅有当所有的系统模块所有开发完毕之 后,我们才进行系统集成,对于一个由上百个模块组的复杂系统来说,这是一个很艰巨而漫长的工作. 随着我们所开发的软件项目越来越复杂,传统的瀑

JNI开发流程-JNI/NDK【转】

本文转载自:http://wiki.jikexueyuan.com/project/jni-ndk-developer-guide/workflow.html 开发流程 JNI 全称是 Java Native Interface(Java 本地接口)单词首字母的缩写,本地接口就是指用 C 和 C++ 开发的接口.由于 JNI 是 JVM 规范中的一部份,因此可以将我们写的 JNI 程序在任何实现了 JNI 规范的 Java 虚拟机中运行.同时,这个特性使我们可以复用以前用 C/C++ 写的大量代

servlet的开发流程及生命周期

Servlet开发流程: 1.  在%TOMCAT_HOME%\webapps下WEB-INF的文件夹写一个文件web.xml (该网站的配置信息),建立一个名为classes的字文件夹 2.  开发servlet(导入servlet-api.jar) 3.  部署你的servlet 在web.xml中添加 <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>