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代码 中的最后两句,都可以正确匹配以上的需求。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容