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),
原文地址:https://www.cnblogs.com/wendyw/p/12012869.html