zoukankan      html  css  js  c++  java
  • Django 框架基本操作(二)

    一、设计表结构

    1.班级表结构

    表名:grade

    字段:班级名称(gname)、成立时间(gdate)、女生总数(ggirlnum)、男生总数(gboynum)、是否删除(isDelete)

    2.学生表结构

    表名:student

    字段:学生姓名(sname)、学生性别(sgender)、学生年龄(sage)、学生简介(scontend)、所属班级(sgrade)、是否删除(isDelete)

    二、配置数据库

    注意:Django默认使用SQLite数据

    在settings.py文件中,通过DATABASES选择进行数据库配置

    配置MySQL

    python3.x安装的是PyMySQL

    #格式
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 数据库名称,
    'USER': 用户名,
    'PASSWORD':密码,
    'HOST':数据库服务器ip,
    'PORT':端口,
        }
    }
    #在__init__.py文件中写入两行代码
    
    import pymysql
    pymysql.install_as_MySQLdb()
    
    #在settings.py中修改Dababases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'myblog',
    'USER': 'root',
    'PASSWORD':'mybolg',
    'HOST':'localhost',
    'PORT':'3306',
        }
    }

    三、创建应用

    在一个项目中可以创建多个应用,每个应用都有一个业务处理

    打开黑屏终端进入myblog目录下的project目录

    #执行命令,myApp是应用名称
    python manage.py startapp myApp
    
    myApp目录说明:
        Admin 站点配置,django为我们提供的后台管理
        models.py模型,ORM,写指定的类,通过命令可以创建数据库结构
        view.py视图,业务代码
        apps配置当前app
        migration数据修改表结构
        tests    单元测试

    1.激活应用

    #在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',#应用名称
    ]

    2.定义模型

    概述:有一个数据表,就对应有一个模型

    #在models.py文件中定义模型,引入models
    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.gdate,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")
    
    #说明:不需要定义主键,在生成时自动添加,并且值为自动增加

    3.在数据库中生成数据表

    #在migrations目录下生成一个迁移文件,执行命令
    python manage.py makemigrations

    在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表

    注意:重新迁移文件的时候,需要把已经迁移的文件进行手动删除,同时把数据库也进行删掉

    4.执行迁移

    #执行迁移,相当于执行sql语句创建数据表
    python manage.py migrate

    5.测试数据操作

    #进入到python shell,执行命令
    python manage.py shell
    
    #引入包
    from myApp.models import Grades,Students
    from django.utils import timezone
    from datetime import *
    
    #查询所有数据
    类名.objects.all()
    Grades.object.all()
    
    #添加数据
    #本质:创建一个模型类的对象
    >>>grade1=Grades()
    >>>grade1.gname="python04"
    >>>grade1.gdate=datetime(year=2017,month=7,day=17)
    >>>grade1.ggirlnum=3
    >>>grade1.gboynum=70
    >>>grade1.save()
    
    #models.py在grades类中添加一个__str__方法
    
    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.gdate,self.ggirlnum,self.gboynum)
    
    #查看某个对象
    类名.objects.get(pk=2)
    Grades.objects.get(pk=2)
    
    #修改数据
    模型对象.属性=新值
    grade2.gboynum=60
    grade2.save()
    
    #删除数据
    模型对象.delete()
    grade2.delete()
    
    #注意:物理删除,数据库中的表里的数据被删除了
    #关联对象
    
    >>>stu = Students()
    >>>stu.sname ="薛艳梅"
    >>>stu.sgender=False
    >>>stu.sage =20
    >>>stu.scontend="我叫薛艳梅"
    >>>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)
    
    #注意:直接添加到数据库中

    6.启动服务器

    格式

    python manage.py runserver ip:port

    ip可以不写,不写的话代表本机ip

    端口号默认是8000

    python manage.py runserver

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

    7.Admin站点管理

    内容发布;负责添加、修改、删除内容;公告访问;配置Admin应用

    在settings.py文件中的INSTALLED_APPS中添加‘django.contrib.admin’,默认已经是配置好了的

    创建管理员用户,执行<python manage.py createsuperuser>,依次输入用户名、邮箱、密码、汉化

    #在settiongs.py文件中修改:
    LANGUAGE_CODE = 'en-us'
    TIME_ZONE = 'UTC'
    
    LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'Asia/Shanghai'
    #管理数据表,修改admin.py文件
    from .models import Grades,Students
    
    #注册
    admin.site.register(Grades)
    admin.site.register(Students)
    
    #自定义管理页面,属性说明,列表页属性:list_display、显示字段:list_filter、过滤字段:search_fields、搜索字段:list_per_page、分页、添加、修改页属性:fields、属性的先后顺序:fieldsets、给属性分组  注意:fields与fieldsets不能同时使用
    
    #关联对象
    
    #需求:在创建一个班级时可以直接添加几个学生
    
    class StudentsInfo(admin.TabularInline): #StackedInline
        model = Students
        extra =2
    class GradeAdmin(admin.ModelAdmin):
        inlines = [StudentsInfo]
    
    #布尔显示问题
    
    from .models import Grades,Students
    #注册
    class GradeAdmin(admin.ModelAdmin):
        #列表页属性
        list_display = ['pk','gname','ggirlnum','gboynum','isDelete']
        list_filter = ['gname']
        list_per_page = 5
        search_fields = [ 'gname']
        #添加、修改页属性
        fields = ['ggirlnum','gboynum','gname','gdate','isDelete']
        fieldsets =[
            ("num",{"fields":['ggirlnum','gboynum']}),
            ("base",{"fields":['gname','gdate','isDelete']}),
        ]
    admin.site.register(Grades,GradeAdmin)
    
    执行动作的位置
    
    class StudentsAdmin(admin.ModelAdmin):
        def gender(self):
            if self.gender():
                return ""
            else:
                return  ""
        #设置页面列的名称
        gender.short_description="性别"
        list_display =['pk','sname''sage',gender,'scontend','sgrade','isDelete']
        list_per_page =10
        #执行动作的位置
        actions_on_top = False
        actions_on_bottom = True
    admin.site.register(Students,StudentsAdmin)
    
    使用装饰器完成注册
    
    @admin.register(Students)
    class StudentsAdmin(admin.ModelAdmin):
        def gender(self):
            if self.gender():
                return ""
            else:
                return  ""
        #设置页面列的名称
        gender.short_description="性别"
        list_display =['pk','sname''sage',gender,'scontend','sgrade','isDelete']
        list_per_page =10
        #执行动作的位置
        actions_on_top = False
        actions_on_bottom = True
    #admin.site.register(Students,StudentsAdmin)
    
    实例:
    1、在settings.py里修改数据库名
    2、在settings.py里修改数据库密码
    3、删除迁移文件
    4、在数据库中创建对应第一步的数据库
    5、执行生成迁移文件
    6、执行迁移
    7、启动服务
    8、浏览器测试

    四、视图的基本使用

    在django中,视图对web请求进行回应,视图接收request对象作为第一个参数,包含了请求的信息.

    视图就是一个python函数,在views.py文件中定义

    #定义视图
    
    from django.http import HttpResponse
    def index(request):
        return HttpResponse("sunck is a good man")
    def detail(request,id):
        return HttpResponse("detail %s"%id)
    #修改project1目录下的urls.py文件
    
    from django.conf.urls import url,include
    from django.contrib import admin
    urlpatterns = [
        url('^admin', admin.site.urls),
        url('^', include('myApp.urls')),
    ]
    #修改myApp目录下的urls.py文件
    
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url('^$', views.index),
        url('^(d+)/', views.detail),
    ]

    五、模板的扩展

    #写students.html模板
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>学生信息</title>
    </head>
    <body>
        <h1>学生信息列表</h1>
        <ul>
            {% for student in students %}
            <li>{{ student.sname}}--{{ student.scontend }}--{{ student.sgrade }}</li>
            {% endfor %}
        </ul>
    </body>
    </html>
    #定义视图
    
    from .models import Students
    def students(request):
        studentsList = Students.objects.all()
        return render(request,'myApp/students.html',{"students":studentsList})
    #配置url
    
        url(r'^students/$', views.students),
    #需求:点击班级,显示对应班级的所有学生,定义视图
    
    def gradeStudents(request,num):
        #获得对应的班级对象
        grade = Grades.objects.get(pk=num)
        #获得班级下的所有学生对象列表
        studentsList = grade.students_set.all()
        return render(request,'myApp/students.html',{"students":studentsList})
    
    #配置url
    
        url(r'^grades/(d+)$',views.gradeStudents)

    1.模板的基本使用

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

    创建模板目录:在模板目录<templates>下创建对应项目名字的目录,用来存放该项目的模板文件

    ps:templates目录也可以放在myApp应用目录下

    #配置settings.py文件,设置TEMPLATES的DIRS值
    
    定义一个cla.html模板和一个student.html模板
    
    #语法
    
    {{输出值,可以是变量,也可以是对象.属性}}
    
    {%执行代码段%}

    2.在view.py中使用模板文件

    from . models import classInfo
    #显示班级信息
    def classlist(request):
        #获取所有班级信息
        classlist=classInfo.objects.all()
        #渲染模板返回页面
        return render(request,'myApp/grades.html',{"class":classlist})
    
    #在cla.html模板中添加数据
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
    <h1>班级列表</h1>
    <ul>
        {% for cla in classlist %}
        <li><a href='#'>{{ cla.cname }}</a></li>
        {% endfor %}
    </ul>
    </body>
    </html>
    
    from .models import Students
    def students(request):
        studentsList = Students.objects.all()
        return render(request,'myApp/student.html',{"stu":studentsList})
    
    #在student.html模板加载数据
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>学生信息</title>
    </head>
    <body>
        <h1>学生信息列表</h1>
        <ul>
            {% for student in students %}
            <li>{{ student.sname}}--{{ student.scontend }}--{{ student.sgrade }}</li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    #在myApp目录下的urls.py文件中配置路由
    
    url(r'^cla/$',views.classlist),
    url(r'^students/$',views.studnet),
  • 相关阅读:
    你应该掌握的——树和二叉树
    nyist oj 63(二叉树)
    非递归遍历二叉树的四种策略先序、中序、后序和层序
    学习的四种境界
    nyist oj 467 (中缀式变后缀式)
    二叉平衡树
    nyist OJ 35 (表达式求值)
    线索二叉树
    二叉树的三种遍历方法(递归和非递归)
    算法学习之路
  • 原文地址:https://www.cnblogs.com/wendyw/p/12012869.html
Copyright © 2011-2022 走看看