Django框架开发web应用

一、环境配置

       (1)安装python(3.6)

             1.下载安装包: www.python.org/downloads/r…

             2.Linux系统一般默认安装Python2.7,如使用Python3.6自行编译安装

             3.MacOS和Windows点击对应安装包,进行"下一步"操作即可

       (2)安装pip

             1. 下载压缩包:pypi.org/project/pip…

             2. 解压并进入目录执行命名:

                     $ python setup.py install

              3. 将C:\Python36\Scripts;添加至path环境变量,否则无法使用pip命令

              4. cmd中输入pip可查看其帮助

       (3)安装django

              1. 安装

                  $ pip install django

              2. 添加环境变量path

                  C:Python36\Lib\site-packages

              3. 查看django命令 $ django-admin help 如下图说明安装成功

                  


二、创建项目及应用

     (1)命令行创建项目,myapp为项目目录名称:   λ django-admin startproject myapp

             新建成功时没有任何提示如下图,当前目录内生成myapp目录

        

      (2)进入项目目录 如下图

           

      (3)如图,根目录包含入口文件mange.py和同名目录myapp/

           

        (4)初始化目录结构如上图

      -myapp : 项目根目录
         -myapp : 自动生成的同名模块,存放项目配置文件
            __init__.py : 空文件, 用来告诉python当前目录是python模块
            settings.py : 包含项目所有配置参数
            urls.py : URL根配置
            wsgi.py : 内置runserver命令的WSGI兼容的web服务器入口
         -manage.py : 应用的入口文件复制代码

          (5)创建应用,一个应用编写代码开发一个业务模块,booker为自定义应用名称

                  λ python manage.py startapp booker 

           (6)如上图 生成booker目录   

        -myapp : 项目根目录
          -booker : 应用名称(目录)
            -migrations : 数据迁移文件目录, 初始化时内部只有一个空文件 __init__.py
             __init__.py : 告诉python目录booker为一个python模块
             admin.py : 用于开发后台管理文件
             apps.py : 对应应用的setting设置,1.9版本后从settings.py分割出来.
             models.py : 用于模型开发
             tests.py : 用于单元测试
             views.py : 用于视图开发复制代码

          (7)将booker应用添加到settings.py文件下

 INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booker',
]复制代码

         (8)运行项目 λ python manage.py runserver 8080 , 端口默认为8000,

下图红色部分提示是因为有迁移文件未执行迁移, 可执行 λ python manage.py migrate生成表,也可等创建完模型类后一并执行.


三、创建模型类

    项目是基于数据驱动,使用ORM操作将模型对象转换为关系型数据库

    1.  打开应用的models.py定义两个模型类BookInfoHeroInfo

from django.db import models

# Create your models here.
# 模型类若要与数据库交互必须继承于models.Model类
# 创建BookInfo模型类
# 定义字段属性title, pub_date,类型分别为CharField和DateField并为字符串定义条件
class BookInfo(models.Model):
	"""docstring for BookInfo"""
	title = models.CharField(max_length=30)
	pub_date = models.DateField()
	def __str__(self):
		return self.title

# 创建HeroInfo模型类
# 定义字段name,gender,skill,intro,book
# book定义为外键,关联模型BookInfo, 
# Django2.0+版本设置外键时需填写on_delete参数否则报异常,参考<Django2.0关联表必填on_delete参数>
class HeroInfo(models.Model):
	"""docstring for HeroInfo"""
	name = models.CharField(max_length=20)
        gender = models.BooleanField(default=True)
	skill = models.CharField(max_length=200)
        intro = models.CharField(max_length=300)
	book = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
	def __str__(self):
		return self.name复制代码

参考 : <Django2.0关联表必填on_delete参数>

 2 . 生成迁移文件并执行迁移

     命令行λ python manage.py makemigrations后左侧项目内migrations目录生成0001_initial.py迁移文件

      

     命令行λ python manage.py migrate 生成db.sqlite3数据文件



     3. 到此数据模型类创建完毕 ,接下来可在django自带的交互环境λ python manage.py shell操作数据,也可以跳到第四步登录后台进行操作, 以下是交互环境下简单的数据库操作


In [1]: from booker.models import BookInfo    # 导入应用模块
In [2]: BookInfo.objects.all()                # 查询所有
Out[2]: <QuerySet []>                         # 首次为空列表

In [3]: book = BookInfo()                     # 创建实例对象book
In [4]: book.title='笑傲江湖'                  # 添加属性值

In [5]: from datetime import date             # 导入时间模块
In [6]: book.pub_date=date(1999,10,1)         # 添加属性值
In [7]: book.save()                           # 保存对象

In [9]: BookInfo.objects.all()                # 查询所有数据
Out[9]: <QuerySet [<BookInfo: 笑傲江湖>]>      # 显示已添加数据, 如不显示内容需在BookInfo模型中定义方法def __str__(self)

In [10]: BookInfo.objects.get(id=1)           # 根据id获取对象
Out[10]: <BookInfo: 笑傲江湖>                               
In [11]: book = BookInfo.objects.get(id=1)    # 查找指定对象                                    
In [12]: book.title = '倚天屠龙记'             # 修改属性值
In [13]: book.save()                          # 修改后需保存
In [14]: BookInfo.objects.get(id=1)           # 再次查询
Out[14]: <BookInfo: 倚天屠龙记>                # title已被修改

In [17]: book.delete()                        # 删除对象               
Out[17]: (1, {'booker.HeroInfo': 0, 'booker.BookInfo': 1})   
                                                             
In [18]: BookInfo.objects.all()                              
Out[18]: <QuerySet []>                        # 删除后空列表   


# HeroInfo数据库操作类似,不同在于关联部分, 与BookInfo关联前需填充BookInfo数据
In [19]: from booker.models from HeroInfo      # 导入HeroInfo模型
....    # 添加属性值略
In [20]: book=BookInfo.objects.get(id=1)       # book属性定义为BookInfo列表指定对象
In [21]: book
Out[21]: <BookInfo: 倚天屠龙记>
In [22]: book.heroinfo_set.all()               # 显示book对象对应的heroinfo列表
Out[22]: [<HeroInfo: HeroInfo object>]复制代码


四、后台管理

   1 . 创建超级管理员账号λ python manage.py createsuperuser账号,邮箱,密码,密码确认

       

    2 . 运行服务λ python manage.py runserver 8080输入后台 http://127.0.0.1:8080/admin/

输入账号密码登录后台.

       

      3 . 改为中文界面,回到编辑器 myapp/myapp/settings.py, 把红线标记部分修改后刷新后台页面即可改成中文

LANGUAGE_CODE = 'zh-Hans'                # 1.8版本后使用的中文
TIME_ZONE = 'Asia/Shanghai'              # 中国时区
复制代码

         


      4 . 注册模型类,并在后台显示已创建的模型类 

           回到编辑器 myapp/booker/admin.py , 编写以下代码后刷新浏览器

from django.contrib import admin
from booker.models import *      # 引入模型类, 2.0版本根路径基于myapp开始

# Register your models here.
# 2 .显示模型类字段,并继承admin.ModelAdmin模块
class BookInfoAdmin(admin.ModelAdmin):
	"""docstring for BookInfoAdmin"""
	# 后台显示的字段
	list_display = ['id','title','pub_date']

class HeroInfoAdmin(admin.ModelAdmin):
	"""docstring for HeroInfoAdmin"""
	list_display = ['id','name','gender','skill','intro', 'book']

# 1. 注册模型类
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)	
复制代码

       

       5 . 点击进入Book infosHero infos表进行CRUD操作, 注意低版本django进入修改可能会出现编码错误提示'UnicodeEncodeError', 原因是models中类定义的def __str__(self)方法返回了中文, 需后面添加  .encode('utf-8')



五、创建视图

   1 . 在应用booker/views.py编写视图函数

from django.shortcuts import render
from django.http import HttpRequest
from booker.models import *
# Create your views here.
#HttpRequest
def index(request):           # 函数名自定义,对应url路由
    # HttpResponse
    return HttpResponse('<h2>首页</h2>')
复制代码

   2 . 配置url路由: 新建应用子路由booker/urls.py

# 配置路由url
from django.urls import path
from booker import views
urlpatterns = [
    path('',views.index),   # 指向booker/views.py的index
]
复制代码

     3 . 将子路由模块urls.py添加到项目myapp/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),   # 旧版本可能使用url(),2.0推荐使用path()
    path('',include('booker.urls'))   # 指向booker/urls.py模块, 2.0以上须使用include否则报异常
]
复制代码

    4 . 刷新http://127.0.0.1:8080/显示"首页" , 路由访问的顺序是: manage.py-->myapp/settings.py-->myapp.urls.py-->booker/urls.py-->booker/views.py-->index-->模板文件


六、创建模板

    1 . 创建模板 myapp/templates/booker/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h2>首页</h2>
</body>
</html>
复制代码

     2. 修改之前新建的booker/views.py下的index方法,将return HttpResponse()改为return render()

#HttpRequest
def index(request):
    # HttpResponse
    # return HttpResponse('<h2>首页</h2>')   # 修改前
    return render(request, 'booker/index.html')   # 修改后
复制代码

    3 . 此时还需配置模板文件的根目录, 进入myapp/settings.py 

 'DIRS': [os.path.join(BASE_DIR, 'templates')],

   

       4 . 刷新浏览器,模板渲染成功,页面显示正常.

七、数据渲染   

      1 . 变量使用, 修改booker/views.py

from django.shortcuts import render
from django.http import HttpResponse
from booker.models import *                 # 导入模型类
# Create your views here.
#HttpRequest
def index(request):
    # HttpResponse
    # return HttpResponse('<h2>首页</h2>')
    title = 'Django首页'                        # 定义变量title
    booklist = BookInfo.objects.all()           # 定义变量booklist,从模型BookInfo获取数据
    context = {                                 # 定义字典,保存变量
	'title': title,
	'books': booklist
    }
    return render(request, 'booker/index.html', context)        # render第三个参数传入字典
复制代码

       2 . 模板booker/index.html接收变量

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h2>首页</h2>
    <ul>
	{% for book in books %}
	 <li><a href="/{{ book.id }}/">{{ book.title }}</a></li>
	 {% endfor %}
    </ul>
</body>
</html>
复制代码

       3 . 刷新浏览器,显示后台BookInfo数据

 

     4 . 添加详情页路由, 添加到booker/urls.py

# 配置路由
from django.urls import path, re_path
from booker import views
urlpatterns = [
	path('', views.index),
	re_path('detail/(\d+)/',views.detail),    
        # 详情页路由,使用正则匹配时应用re_path()方法
        #正则表达式第一个()对应detail方法第二个参数,依次类推
]复制代码

参考re_path() juejin.im/post/5aeed5…

     5 . 修改模板booker/index.html, 如路由中不使用detail前缀则不用修改

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h2>首页</h2>
    <hr>
    <ul>
	{% for book in books %}
	<li><a href="/detail/{{ book.id }}/">{{ book.title }}</a></li>
	{% endfor %}
    </ul>
</body>
</html>
复制代码

     6 . booker/views.py添加detail方法

def detail(request, id):     # id为路由传入的值
	book = BookInfo.objects.get(id=id)   # 根据id查找书名
	heros = book.heroinfo_set.all()      # 根据书名查找heros
	context = {
		'book': book,
		'heros': heros 
	}
	return render(request, 'booker/detail.html', context)
复制代码

    7 . 新建booker/detail.html模板

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>{{ book.title }}</title>
</head>
<body>
	<a href="/">返回首页</a>
	<hr>
	<h2>book详情</h2>
	<div>
		<h3>书名: {{ book.title }}</h3>
		<p>日期: {{ book.pub_date }}</p>
	</div>
	<div>
		<h3>英雄列表</h3>
		<ul>
			{% for hero in heros %}
			<li>
				<div>姓名: {{ hero.name }}</div>
				<div>性别: 
					{% if hero.gender == True%}
					<span>男</span>
					{% else %}
					<span>女</span>
					{% endif %}
				</div>
				<div>技能: {{ hero.skill }}</div>
				<div>简介: {{ hero.intro }}</div>
			</li>
			{% endfor %}
		</ul>
	</div>
</body>
</html>
复制代码

      8 . 回到浏览器刷新页面, 点击列表即可进入详情页面



八、总结(思维导图)

   



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值