Django1.11.4 版本支持Python3.5 3.6

1.Django安装
pip install django==1.11.4

2.验证是否安装成本

python

import django
django.get_version()

3.创建项目

a. 在合适位置创建一个目录django_pratice

b. 打开cmd,进入创建的django_pratice目录下

c. django-admin startproject django_demo(项目名)

d. cmd下输入tree . /f查看目录层级

manage.py      一个命令行工具,可以让我们用多种方式对Django项目进行交互
 __init__.py     一个空文件,它告诉Python这个目录应该被看做一个包
settings.py     项目的配置文件(主要处理文件)
urls.py         项目的url声明 (主要处理文件)
wsgi.py         项目与WSGI兼容的Web服务器入口


4. 基本操作


a.设计表结构

班级表结构: 表名1----grades  字段---班级名称(gname)、成立时间(gdate)、女生总数(ggirlnum)、男生总数(gboynum)、是否删除(isDelete)
学生表结构:  表名2----students 字段---学生姓名(sname)、学生性别(sgender)、学生年龄(sage)、学生简介(scontend)、学生班级(sgrade)、是否删除(isDelete)

b.配置数据库(Django默认使用SQLite数据库)

在settings.py文件中通过DATABASES选项进行数据库配置(先决条件:配置MySQL且Python3.x中安装的是PyMySQL)

在__init__.py文件中写入两行代码
        import pymysql
                pymysql.install_as_MySQLdb()
创建数据库django_demo
        create database django_demo(数据库名)
以数据库django_demo为例进行示范:对settings.py中的DATABASES进行设置
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': "django_demo",
                    'USER': "root",
                    'PASSWORD': "123456",
                    'HOST': "localhost",
                    'PORT': "3306"
                }
            }
c. 创建应用------在一个项目中可以创建多个应用,每个应用进行一种业务处理
         
打开cmd,进入django_demo目录下的django_demo(项目目录)的目录,输入命令创建名为myApp的app:
        python manage.py startapp myAPP(应用名)

myAPP目录说明:
    admin.py    进行站点配置
    models.py   创建模型
    views.py    创建视图

d. 激活应用
在settings.py文件中,将myApp应用加入到INSTALLED_APPS选项中
INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'myAPP',
    ]
e. 定义模型(有一个数据表就对应有一个模型,在models.py文件中定义模型)
引入:from django.db import models,模型类要继承models.Model类

示例:
                class Grades(models.Model):
                    gname = models.CharField(max_length=20)
                    gdate = models.DateTimeField()
                    ggirlnum = models.IntegerField()
                    gboynum = models.IntegerField()
                    isDelete = models.BooleanField(default=False)
            def __str__(self):
                    return "%s--%d--%d" % (self.gname, self.ggirlnum, self.gboynum)
                class Students(models.Model):
                    sname = models.CharField(max_length=20)
                    sgender = models.BooleanField(default=True)
                    sage = models.IntegerField()
                    scontend = models.CharField(max_length=20)
                    isDelete = models.BooleanField(default=False)
                    sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE,) # 不需要定义主键,在生成时自动添加,并且值为自动增加
f. 在数据库中生成数据表
打开cmd,进入django_demo目录下的django_demo(项目目录)的目录
生成迁移文件: 执行 python manage.py makemigrations    在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表
执行迁移: 执行 python manage.py migrate           相当于执行MySQL语句创建了数据表  select * from myapp_students;   desc myapp_students;

g. 测试数据操作

打开cmd,进入django_demo目录下的django_demo(项目目录)的目录,输入 python manage.py shell
引入包
        from myAPP.models import Grades, Students
            from django.utils import timezone
            from datetime import *
查询所有数据    类名.objects.all()   示例: Grades.objects.all()
添加数据(本质:创建一个模型类的对象实例即创建一个数据表,类中的属性对于表中的字段)    
         grade1 = Grades()
             grade1.gname = "python01"
             grade1.gdate = datetime(year=2017, month=7, day=17)
             grade1.ggirlnum = 3
             grade1.gboynum = 70
             grade1.save()    
查看某个对象     类名.objects.get(pk=索引号)  示例:Grades.objects.get(pk=2)
修改某个数据     模型对象属性 = 新值      示例:grade2.gboynum = 60   grade2.save()
删除数据         模型对象.delete()        示例:grade2.delete()
(注意:这是物理删除,数据库中的相应数据被永久删除)

关联对象

    示例:
        stu = Students()
        stu.sname = "curry"
        stu.sgender = False
        stu.sage = 20
        stu.scontend = "I am curry"
        stu.sgrade = grade1
        stu.save()
获得关联对象的集合
    需求:猎取python04班级的所有学生   
    对象名.关联的类名小写_set.all()   示例:grade1.students_set.all()
    
    需求:创建曾志伟,属于python04班级
     示例:
stu3 = grade1.students_set.create(sname=u'曾志伟',sgender=True,scontend=u"我叫曾志伟",sage=45)( 注意:汉字要转码,这样创建的数据直接被添加到了数据库当中。)

h. 启动服务器
打开cmd,进入django_demo目录下的django_demo(项目目录)的目录
        格式:python manage.py runserver ip:port(注意:ip可以不写,不写代表本机ip,端口号默认是8000)  示例:python manage.py runserver

        说明:这是一个纯python编写的轻量级web服务器,仅仅在开发测试中使用这个

i. Admin站点管理

概述:内容发布----负责添加,修改,删除内容;公告访问-----xxx
        
配置Admin应用: 在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',这条默认是添加好的。
创建管理员用户:

      新开cmd,在项目目录下执行 python manage.py createsuperuser依次输入账号名,邮箱,密码即可完成用户创建   
登陆:
    http://127.0.0.1:8000/admin/
汉化:
    把django_demo目录下的settings.py中作如下设定:LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'
    再重启web服务---python manage.py runserver

管理数据表:
        修改 myAPP\admin.py 如下:
            from django.contrib import admin
                   # Register your models here.
                from .models import Grades, Students
                # 注册
                admin.site.register(Grades)
                admin.site.register(Students)
        
        自定义管理页面:-------------在admin.py文件下写一个类

            属性说明:
                        # 列表页属性
                        list_display = [] # 显示字段设置
                        list_filter = [] # 过滤字段设置
                        search_fields = [] # 搜索字段设置
                        list_per_page = [] # 分页设置
                        # 添加,修改页属性
                        fields = []        # 规定属性的先后顺序
                        fieldsets = [] # 给属性分组 (注意:fields与fieldsets不能同时使用)
            
            属性示例:
                # 列表页属性
                        list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']显示字段
                        list_filter = ['gname']  
                        search_fields = ['gname']
                        list_per_page = 5   
                        # 添加,修改页属性
                        #fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
                        fieldsets = [
                                ("num",{"fields":['ggirlnum', 'gboynum']}),
                                ("base", {"fields":["gname", "gdate", "isDelete"]}),
                        ]
            关联对象:需求:在创建一个班级时可以直接添加几个学生
                class StudentsInfo(admin.TabularInline):# 可选参数admin.StackedInline
                            model = Students
                            extra = 2
                        class GradesAdmin(admin.ModelAdmin):
                            inlines = [StudentsInfo]
             布尔值显示问题示例:
                class StudentsAdmin(admin.ModelAdmin):
                            def gender(self):
                                    if self.sgender:
                                    return "男"
                                    else:
                                    return "女"
                    # 设置页面列的名称
                            gender.short_description = "性别"
                            list_display = ['pk', 'sname', 'sage', gender,
                                                'scontend', 'sgrade', 'isDelete']
                            list_per_page = 10
                            admin.site.register(Students, StudentsAdmin)
             执行按钮位置:
                        class StudentsAdmin(admin.ModelAdmin):
                                ...snip...
                            actions_on_top = False
                            actions_on_bottom = True
                            admin.site.register(Students, StudentsAdmin)
             使用装饰器完成注册:
                            @admin.register(Students)
                            class StudentsAdmin(admin.ModelAdmin):
                                    def gender(self):
                                        ...snip...
                                        actions_on_top = False
                                        actions_on_bottom = True
j. 视图的基本使用

概述:在Django中,视图是对web请求进行回应,视图就是一个python函数,在views.py文件中定义。

定义视图:示例:在myApp\views.py中写入

        from django.shortcuts import render
            # Create your views here.
            from django.http import HttpResponse
            def index(request):
                return HttpResponse("Curry is a good man")
配置url:
    方法:url方法
         修改django_demo目录下的urls.py文件:
            from django.contrib import admin
            from django.conf.urls import url,include

            urlpatterns = [
                url(r'^admin/', admin.site.urls),
                url(r'^', include('myAPP.urls')),
            ]
            在myAPP应用目录下创建urls.py文件:
            from django.conf.urls import url
            from . import views

            urlpatterns = [
                url(r'^$', views.index),
            ]
k. 模板的基本使用

概述:模板是HTML页面,可以根据视图中传递过来的数据进行填充

创建模板:
           创建templates目录,在目录下创建对应项目的模板目录(django_demo/templates/myAPP)

配置模板路径:

       修改settings.py文件下的TEMPLATES下的'DIRS'为'DIRS': [os.path.join(BASE_DIR, 'templates')],

定义grades.html与students.html模板:

        在templates\myAPP\目录下创建grades.html与students.html模板文件
        模板语法:
                    {{输出值,可以是变量,也可以是对象,属性}}
                    {%执行代码段%}
         http://127.0.0.1:8000/grades

        写grades.html模板:
            <!doctype html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport"
                      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
                <meta http-equiv="X-UA-Compatible" content="ie=edge">
                <title>班级信息</title>
            </head>
            <body>
                <h1>班级信息列表</h1>
                <ul>
                    <!--[python04, python05, python06]-->
                    {%for grade in grades%}
                    <li>
                        <a href="#">{{grade.gname}}</a>
                    </li>
                    {%endfor%}
                </ul>
            </body>
            </html>