1.Django走通流程

  • 安装

进入终端输入

pip install Django==2.0

等待安装完成,验证是否安装成功,在终端输入

import django

回车后,如果不报错,代表能正常导入django,安装是成功的

  • 创建项目

在想要创建项目的目录,在终端进入到这个目录(注意目录不要出现中文),
在终端输入

django-admin startproject [项目名]

==[项目名]自定义==,
回车后,等待项目创建成功(为了下文描述方便,此处的项目名blogproject为例)

终端输入

tree blogproject
查看生成的项目目录结构如下

[图片上传失败...(image-cb2469-1538141956148)]

  • 项目目录说明

manage.py - 一个命令行工具,可以使我们与项目进行交互

settings.py - 项目的配置文件

urls.py - 项目的URL声明

wsgi.py - 项目与WSGI兼容的Web服务器入口

  • 基本操作
  1. 设计表结构

(1)班级表结构

表名 grade

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

(2)学生表结构

表名 students

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

2.配置数据库

django默认使用的是sqlite3数据库,这里配置mysql,在settings文件中,通过修改DATABASES选项进行数据库配置,

(1)先安装python3的mysql链接工具,这里使用的是pymysql

pip install pymysql

(2)在项目的的init.py中写入

import pymysql  
pymysql.install_as_MySQLdb()

(3)新建一个数据库(blog),下面的配置要用到,在settings中修改的内容如下

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog',#数据库名
        'USER': 'root',#数据库用户名
        'PASSWORD':'root',#数据库密码
        'HOST': '127.0.0.1',#数据库地址
        'PORT': '3306',#端口号
    }
}

3.创建应用

在一个项目中可以创建多个应用,每个应用进行一种业务处理,在终端进入之前新建的项目目录(blogproject),输入

python3 manage.py startapp blog

即在当前项目下新建一个应用名为blog的应用,此时的目录结构

[图片上传失败...(image-6b81ae-1538141956148)]

目录说明

admin.py 站点配置

models.py 模型

views.py 视图

在settings.py文件中,将上面新建的app(blog)加入注册到项目中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

4.定义模型

在models.py中定义上面数据表结构对应的模型,所有的模型继承==models.Model==

  • 班级模型
from django.db import models
class Grade(models.Model):
    gname = models.CharField(max_length=20,verbose_name='班级')
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField()
    isDelete = models.BooleanField()

一个模型类对应数据库中的一张表,类里的属性对应表中的一个字段

  • 学生模型
class Student(models.Model):
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    scontend = models.CharField(max_length=100)
    isDelete = models.BooleanField(default=False)
    sgrade = models.ForeignKey("Grade",on_delete=models.CASCADE)

在定义模型的时候,不需要定义主键,在数据迁移时,自动生成主键,并且值为自动增加的

5.生成数据表

执行如下命令生成迁移文件

python manage.py makemigrations

==注意:== 此时只是在migrations目录下生成了迁移文件,并没有生成数据表,若生成数据表,需要进一步执行迁移命令

python manage.py migrate

  1. 启动服务器
    执行如下命令启动测试服务器

python manage.py runserver ip:port

==ip:port== 可不写,代表使用默认的ip地址和端口号
127.0.0.1:8000

7.站点管理

  • 配置admin应用

在settings.py文件中的INSTALLED_APPS中添加‘django.contrib.admin’,这个站点管理应用在新建项目的时候已经自动添加了,但是若想要进行站点管理,需要管理员登录到站点管理后台,需要创建一个超级管理员账号,用到如下命令

python manage.py createsuperuser

按照提示依次输入用户名,Email,密码,创建完成,在测试服务器启动的情况下,在浏览器中打开127.0.0.1:8000/admin进入站点管理页面,输入刚才创建管理员时输入的用户名和密码,看到页面为英文,若改为汉语
,在settings.py的配置中修改

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

再次打开站点管理页面,可以看到汉语页面。

  1. 管理数据表
  • 修改admin.py 文件,将模型注册到站点管理中
from .models import Grade, Student
# 注册
admin.site.register(Grade)
admin.site.register(Student)

刷新站点管理后台,看到项目中的两个模型Grade 和Student已经被注册到管理后台了。

  • 自定义管理页面

修改注册model的各个属性,
常用属性如下:

from .models import Grade, Student
class GradeAdmin(admin.ModelAdmin):
    # 列表页属性
    #   list_display 要显示的属性
    #   list_filter 过滤器
    #   search_fields 搜索字段
    #   list_per_page 分页
    list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']
    list_filter = ['gname']
    search_fields = ['gname']
    list_per_page = 3
    # 添加 修改属性
    #   fields  修改字段显示顺序
    #   fieldsets 字段分组展示
    # 以上两个属性不能同时使用
    # fields = []
    fieldsets = [
        ('num',{'fields':['ggirlnum','gboynum']}),
        ('base',{'fields':['gname','gdate','isDelete']})
    ]


class SutdentAdmin(admin.ModelAdmin):
    list_display = ['pk', 'sname', 'sgender',
                    'sage', 'scontend', 'sgrade', 'isDelete']
    list_filter = ['sgrade']
    search_fields = ['sname']
    list_per_page = 3


# 注册
admin.site.register(Grade, GradeAdmin)
admin.site.register(Student, SutdentAdmin)
  • 关联对象

==需求:在创建一个班级时可以直接添加几个学生==

在admin.py中编辑如下代码

class StudentInfo(admin.TabularInline):
    model = Student
    extra = 2
    
class GradeAdmin(admin.ModelAdmin):
    inlines = [StudentInfo]
    ...

得到修改后的添加Grade页面如下

[图片上传失败...(image-2245e0-1538141956148)]

  • Boolean值显示问题

==需求:将学生的管理页面展示的True和False对应的标记改成“男”和“女”==

class SutdentAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender:
            return "男"
        else:
            return "女"
    #设置页面列的名称
    gender.short_description = "性别"
    ...
  • 使用装饰器完成注册

不需要使用

admin.site.register(Grade, GradeAdmin)
admin.site.register(Student, SutdentAdmin)

完成模型的注册,使用装饰器注册模型方式如下

@admin.register(Student)
class SutdentAdmin(admin.TabularInline):
    ...

@admin.register(Grade)
class GradeAdmin(admin.ModelAdmin):
    ...
  • 视图

定义一个视图

from django.http import HttpResponse

def index(request):
    return HttpResponse("django is a web framework")

这样就定义了一个简单的没有用到模板的视图

若要访问定义好的视图,需要修改urls.py,配置该视图对应的访问路径。一般为了维护方便,各个app有自己的urls.py用来进行视图路径的配置管理,即在myApp下新建urls.py文件,同时需要在项目的urls.py中包含这个文件。

project下的urls.py文件配置:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('myApp.urls'))
]

应用下的urls.py文件配置:

from django.urls import path

from . import views

urlpatterns = [
    path('',views.index)
]
  • 模板基本使用

在项目目录下创建templates目录,在该文件夹下创建应用对应的文件夹,此处为myApp,避免不同的应用会存在同名的模板文件,或者一个项目中的模板文件过多,不易维护,模板文件夹创建完成后,要在settings.py中配置模板的路径。

在项目的settings.py中有个一句

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))

‘BASE_DIR’ 代表了当前项目的根目录

要配置模板对应的路径只需要在BASE_DIR路径后拼接上templates就可以了,即修改settings.py下的TEMPLATES列表为:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,

在templates下定义两个模板分别为grade.html和student.html,在grades.html中展示班级的相关信息,在students.html中显示学生相关信息。

==需求:输入http://127.0.0.1:8000/grades访问班级信息列表,输入http://127.0.0.1:8000/students访问学生信息列表==

编写grades.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级信息</title>
</head>

<body>
    <h1>班级信息列表</h1>
    <ul>
        {% for grade in grades%}
        <li><a href="#">{{grade.gname}}</a></li>
        {% endfor %}
    </ul>
</body>
</html>

编写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}}</li>
        {%endfor%}
    </ul>
</body>

</html>

创建grades对应的视图方法

def grades(request):
    #去模型中取数据
    grades = Grade.objects.all()
    #将数据传递个模板,模板负责渲染页面
    return render(request,'myApp/grades.html',{'grades':grades})

创建students模板对应的视图

def students(request):
    students = Student.objects.all()
    return render(request,'myApp/students.html',{'students':students})

在应用的url.py中配置url分发

from django.urls import path

from . import views

urlpatterns = [
    path('',views.index),
    path('grades/',views.grades),
    path('students/',views.students),
]

==需求:点击班级信息列表中的班级链接,展示该班级对应的学生。==

修改grades.html模板

...
<li><a href="{{grade.id}}">{{grade.gname}}</a></li>
...

添加gradesStudents视图

def gradesStudents(request,gradeId):
    grade = Grade.objects.get(pk=gradeId)
    students = grade.student_set.all()
    return render(request,'myApp/students.html',{'students':students})

修改myApp下额urls.py

from django.urls import path,re_path

from . import views

urlpatterns = [
    path('',views.index),
    path(r'grades/',views.grades),
    path(r'students/',views.students),
    path('grades/<int:gradeId>',views.gradesStudents),
    # re_path(r'grades/(?P<gradeId>\d+)',views.gradesStudents),
]

==注意:== 这里是django2.0的url匹配方式,和django1.x是有区别的,若是用正则,需要引入re_path模块,以上urlpatterns代码 中的最后两句,都可以正确匹配以上的需求。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容