首页 > 其他 > 详细

Django 框架基本操作(二)

时间:2019-12-09 20:45:18      阅读:87      评论:0      收藏:0      [点我收藏+]

一、设计表结构

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文件中定义模型

引入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.在数据库中生成数据表

生成迁移文件,执行<python manage.py makemigrations>

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

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

4.执行迁移

执行<python manage.py migrate>,相当于执行sql语句创建数据表

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),

 

Django 框架基本操作(二)

原文:https://www.cnblogs.com/wendyw/p/12012869.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!