Django 菜鸟教程(跑通流程)_叫我一番的博客-程序员秘密_django 菜鸟教程

技术标签: django  Django  

Django 教程

一、Django 安装

1、Django 版本对应的 Python 版本:

在这里插入图片描述

2、Django下载地址:

https://www.djangoproject.com/download/

3、安装(无需下载)

打开cmd,输入:pip install Django==1.11.4,然后回车
在这里插入图片描述

4、验证安装

cmd进入python

获取版本信息

import django
django.get_version()

在这里插入图片描述

二、创建第一个项目

1、在合适位置创建一个目录

2、打开DOS进入到上一步创建的目录下

CD C:\Users\Administrator\PycharmProjects\bilibili_qianfeng\bilibili_20200404\01-wj

3、输入:django-admin startproject project

查看目录结构:tree . /F
在这里插入图片描述

4、目录层级说明

manage.py

一个命令行工具,可以让你以各种方式与该Django项目进行交互

init.py

一个空文件,告诉Python该项目是一个Python包

settings.py

项目的配置文件

urls.py

项目的URL申明,一份由Django驱动的网站“目录”

wsgi.py

一个WSGI兼容的Web服务器的入口,以便运行你的项目
在这里插入图片描述

三、基本操作

1、设计表机构

a、班级表结构

表名:grade

字段:

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

b、学生表结构

表名:students

字段:

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

2、配置数据库

注意:Django默认使用Sqlit数据库
在这里插入图片描述
在setting.py文件中,通过DATABASE选项进行数据库配置

a、配置MySQL

python3.x安装的是PyMySQL

在__init__.py文件中写入两行代码

import pymysql
pymysql.install_as_MySQLdb()

b、格式:

在这里插入图片描述

3、创建应用

在一个项目中可以创建多个应用,每个应用进行一种业务处理

a、打开cmd进入01-wj目录下的project的目录

b、执行:python manage.py startapp myAPP

c、myApp目录说明

admin.py

站点配置

models.py

模型

views.py

视图

4、激活应用

在setting.py文件中,讲myApp应用加入到INSTALLED-APPS选项中
在这里插入图片描述

5、定义模型

概述:有一个数据表,就应该对应一个模型
在models.py中定义模型

引入:from django.db import models

模型类要继承models.Model类

from django.db import models

# Create your models here.

class Grades(models.Model):
    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField()
    isDelete = models.BooleanField(default=False)


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

说明:不需要定义主键,在生成时自动添加,并且值为自动增加

6、在数据库中生成数据表

a、生成迁移文件

执行:python manage.py makemigrations
在这里插入图片描述
在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表
在这里插入图片描述

b、执行迁移

执行:python manage,py migrate
在这里插入图片描述
相当于执行sql语句创建数据表
在这里插入图片描述

7、测试数据操作

a、进入到python shell

b、执行:python manage.py shell

在这里插入图片描述

c、引入包:

from myAPP.models import Grades,Students
from django.utils import timezone
from datetime import *

d、查询所有数据

格式:类名.objects.all()
Grades.objects.all()
在这里插入图片描述

e、添加数据

本质:创建一个模型类的对象实例
grade1=Grades()
grade1.gname=‘python04’
grade1.gdate=datetime(year=2020,month=4,day=4)
grade1.ggirlnum=3
grade1.gboynum=70
grade1.save()

f、查询某个对象

格式:类名.objects.get(pk=1)
Grades.objects.get(pk=1)

g、修改数据

模型对象.属性 = 新值
grade1.gboynum = 60
grade1.save()
在这里插入图片描述

h、删除数据

物理删除(真实删除!)

模型对象.delete()

逻辑删除(isDelete = True)

I、关联对象

创建一个学生

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‘’班

stu1 = grade1.students_set.create(sname=u’曾志伟’,sgender=True,scontend=u’我叫曾志伟’,sage=45)

不用save()直接就创建成功

8、启动服务器

a、格式:

python manage.py runserver ip:port
ip可以不写,不写的话代表本机ip
port端口号默认是8000
python manage.py runserver
在这里插入图片描述

b、说明:

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

9、Admin站点管理

a、概述:

内容发布

负责添加、删除、修改内容

公共访问

b、配置Admin应用

在settings.py文件中的INSTALLED_APPS中添加“django.contrib.admin”,默认是已经添加好的
在这里插入图片描述

c、创建管理员用户

执行:python manage.py createsuperuse
依次输入用户名、邮箱、密码
创建后在网址输入账号密码:http://127.0.0.1:8000/admin/

d、汉化

修改settings.py文件
在这里插入图片描述

10、管理数据表

a、修改admin.py文件

from .models import Grades,Students

# 注册
admin.site.register(Grades)
admin.site.register(Students)

b、自定义管理页面

from .models import Grades,Students

# 注册
class GradesAdmin(admin.ModelAdmin):
    # 列表页属性
    list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete']
    list_filter = ['gname']
    search_fields = ['gname']
    list_per_page = 5

    # 添加、修改页属性
    # fields = ['ggirlnum','gboynum','gname','gdate','isDelete']
    # fieldsets = [
    #     ("num",{"fields":['ggirlnum','gboynum']})
    #     ("base",{"fields":['gname','gdate','isDelete']})
    # ]
admin.site.register(Grades, GradesAdmin)

属性说明:

列表页属性

list_display

显示字段

list_filter

过滤字段

search_fields

搜索字段

list_per_page

分页

添加修改属性

fields

属性先后顺序

fieldsets

给属性分组
注意:fields与fieldsets不能同时使用

关联对象

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

class StudentsInfo(admin.TabularInline):# Stackedlnline
    model = Students
    extra = 2
class GradesAdmin(admin.ModelAdmin):
    inlines = [StudentsInfo]

在这里插入图片描述

布尔值显示问题

class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender is True:
            return "男"
        else:
            return "女"
    # 设置页面列的名称
    gender.short_description = "性别"

    list_display = ['pk','sname','sage',gender,'scontend','sgrade','isDelete']
    list_per_page = 2
admin.site.register(Students,StudentsAdmin)

执行动作位置

class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender is True:
            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)

c、使用装饰器完成注册

@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender is True:
            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)

11、视图的基本使用

a、概述:

在django中,视图对web请求进行回应
视图就是一个python函数,在views.py文件中定义

b、定义视图

from django.http import HttpResponse
def index(request):
    return HttpResponse("WJ is a good man")

c、配置url

修改project目录下的url.py文件

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include('myAPP.urls'))
]

在myAPP应用目录下创建一个urls.py文件

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$',views.index)
]

12、模板的基本使用

a、概述:

模板是HTML页面,可以根据视图中传递过来的数据进行填充

b、创建模板目录

创建templas目录,再目录下创建对应项目的模板目录(project/templates/myAPP)

c、配置模板路径

修改settings.py文件下的TEMPLATES

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

d、定义grades.html和students.html两个模板

模板语法

{ {输出值,可以是变量,也可以是对象属性}}
{%执行代码段%}

e、http://127.0.0.1:8000/grades

写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>

定义视图

from .models import Grades
def grades(request):
    # 去模型models里取数据
    gradesList = Grades.objects.all()
    # 讲数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器
    return render(request,'myAPP/grades.html',{
    "grades":gradesList})

配置URL

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$',views.index),
    url(r'^(\d+)\$',views.detail),

    url(r'^grades/$',views.grades)
]

f、http://127.0.0.1:8000/students

写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>

定义视图

from .models import Students
def students(request):
    studentsList = Students.objects.all()
    return render(request,'myAPP/students.html',{
    "students":studentsList})

配置URL

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$',views.index),
    url(r'^(\d+)\$',views.detail),

    url(r'^grades/$',views.grades),
    url(r'^students/$',views.students)
]

g、点击班级,显示对应班级的所有学生

写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>

定义视图

def gradesStudents(requst,num):
    # 获得对应的班级对象
    grade = Grades.objects.get(pk = num)
    # 获得班级下的所有学生对象列表
    studentsList = grade.students_set.all()
    return render(requst,'myAPP/students.html',{
    "students":studentsList})

配置url

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$',views.index),
    url(r'^(\d+)\$',views.detail),

    url(r'^grades/$',views.grades),
    url(r'^students/$',views.students),

    url(r'^grades/(\d+)$',views.gradesStudents)
]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Jones__Wu/article/details/105307097

智能推荐

String和StringBuffer的substring()方法的比較_杋杋杋的博客-程序员秘密_stringbuffer substring

由于String类型不可修改,所以String类的substring()方法返回的是新串这点不意外但是StringBuffer的截取功能返回值类型也不再是StringBuffer本身了,而是一个String类型对象,这点在初学的时候很意外。再去看看StringBuffer中的substring()方法的实现,是通过下列方法new()出一个String对象作为返回值@Overri...

kubeadm 安装集群 1.16.12_zhanw15的博客-程序员秘密

kubeadm 安装集群安装 docker添加源mirror=https://mirrors.aliyun.com# mirror=https://mirrors.ustc.edu.cn### docker 源curl -fsSL ${mirror}/docker-ce/linux/ubuntu/gpg | sudo apt-key addsudo add-apt-repository "deb [arch=amd64] ${mirror}/docker-ce/linux/ubuntu

linux expect 案例_Aidon-东哥博客的博客-程序员秘密

1、linux expect命令,它类似于shell、window中的cmd。本身就是命令2、如果没有需要安装yum info expectyum -y install expect如果不行使用源码安装吧3、man expect案例1:[[email protected] ~]# expect -c 'expect &quot;\n&quot; {send &quot;pressed enter\n&quot;}'   交互式的,...

用对话框作为主窗口;IDD_FORMVIEW资源文件;_duhuzhen的博客-程序员秘密

转自:http://blog.csdn.net/tcjiaan/article/details/8567053前面我们在编写Win32应用程序的思路都是:1、设计窗口类。2、注册窗口类。3、创建窗口。……然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编辑器,操作起来相对方便。于是,就有了一个想法:把对话框用作

SAP MM 盘点凭证上的posting block_喜欢打酱油的老鸟的博客-程序员秘密

SAP MM 盘点凭证上的posting block 如下新建的盘点凭证号,  上面的Posting Block选项没有勾选。 保持这个盘点凭证open状态,对于物料批次组合 R000006890/2002038653去做货物移动, 比如MB1A + 201,  保存,  可以正常过账! 修改盘点凭证,勾选’pos...

随便推点

linux创建分区大小写,Wine Staging 4.10 发布,增加了EXT4不区分大小写的支持_weixin_39774556的博客-程序员秘密

继周一发布Wine 4.10之后,Wine-Staging 4.10现已成为Wine的最新版/测试版的最新工作,用于在Linux和其他平台上运行Windows应用程序和游戏。Wine-Staging 4.10仍在使用超过800个补丁重新基于最新的上游Wine代码,但至少在过去两周内,一些BCrypt补丁进入了上游。 Wine-Staging 4.10也因为删除了允许DirectX 10支持传统NV...

error C2144: 语法错误 : “void”的前面应有“;”_Jeacean的博客-程序员秘密_语法错误:“void”的前面应有“;”

Visual Studio 2015 编译使用OSG的代码时,出现错误,信息如下:error C2144: 语法错误 : “void”的前面应有“;”解决方法:在stdafx.cpp文件开头加入#include &lt;windows.h&gt; //加上这一句,注意头文件的顺序#include &lt;stdafx.h&gt;一开始以为是编码问题,结果加上这个后成功通过...

什么是RPC?_LoveMsChen的博客-程序员秘密

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。...

java.lang.IllegalStateException: Cannot convert value of type_破觉丶的博客-程序员秘密

异常: Caused by: java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'javax.sql.DataSource' for property 'dataSource': no matching editors or conversion strategy found意思: 不能转换类型’java.lang的值。字符串’ to required t

[AHK]新浪实时股票数据接口_liuyukuan的博客-程序员秘密_新浪股票接口

新浪实时股票数据接口http://hq.sinajs.cn/list=code 以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据接口:http://hq.sinajs.cn/list=sh601006这个url会返回一串文本,例如:var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 2

文件系统(filesystem)_dymom的博客-程序员秘密_filesystem

文件系统的特性:我们知道磁盘分区后需要进行格式化,之后操作系统才可以使用这个分隔槽,这是因为每种操作系统所设定的文件属性/权限并不相同,为了存放这些档案数据,需要将分隔槽进行格式化,以成为操作系统能够利用的文件系统格式。而每种操作系统能够使用的文件系统并不相同,例如windows98以前的主要利用的操作系统是FAT,windowns 2000后的版本有所谓的NTFS文件系统,至于l

推荐文章

热门文章

相关标签