django 写 web项目

环境:
python 3.7.4
django 2.2.6 (此版本生命周期长适合2020年和和2021年学习)
环境搭建步骤在上一个博客django在windows环境搭建
在这里插入图片描述

**大致流程

1.创建工程 执行 django-admin startproject project
2.创建项目 执行 python manage.py startapp myApp
3.激活项目 修改settings.py中的INSTALLED_APPS
4.配置数据库 a 修改__init__.py文件
b 修改settings.py文件中的DATABASES
5.创建模型类 在项目目录下的models.py
6.生成迁移文件 执行python manage.py makemigrations
7.执行迁移 执行python manage.py migrate
8.配置站点
9.创建模板目录/项目模板目录
10.在settings.py文件中TEMPLATES配置模板路径
10.在first_project下修改urls.py
11.在项目目录下创建urls.py**

**详细步骤如下

1.first_project/init.py

import pymysql
pymysql.install_as_MySQLdb()

2.first_project/settings.py

因为Django使用默认的是sqlite3,需要更改为mysql

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',     (数据库名)
        'USER': 'root',      (数据库用户名)
        'PASSWORD': '',
        'HOST': 'localhost',    (本机为 localhost 或直接写 127.0.0.1'PORT': '3306',       (数据库端口号默认为3306}
}

3.创建应用

进入项目终端
然后输入  python manage.py startapp myApp
(出错修改1)若出错则注释 "d:\Python_virtualenvs\django\lib\site-packages\django\db\backends\mysql\base.py" 两行
(出错修改2)"d:\Python_virtualenvs\django\lib\site-packages\django\db\backends\mysql\operations.py"中
            把# query = query.decode(errors='replace')
            更换为query = query.encode(errors='replace')
myApp目录说明
    admin.py 站点配置
    models.py 模型
    views.py 视图

4.激活应用

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',
]

5.定义模型

概念:一个数据表对应一个模型(在myApp下的models.py中定义模型)
(1)先导入

from django.db import models
(2)新建类(数据库表名)
class Grades(models.Model):
(3)字段(数据库字段)注意gname字段的unique=true设置
 gname = models.CharField(max_length=20,unique=True)
        gdate = models.DateTimeField()
        ggirlnum = models.IntegerField()
        gboynum = models.IntegerField()
        isDelete = models.BooleanField(default=False)
(4)学生类一样
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',to_field='gname',on_delete='CASCADE')
(5)不需要定义主键,在生成时自动添加,并且值自动增加。

6.生成数据表(在数据库生成数据表)

(1)生成迁移文件(其实就是在midrations目录下生成迁移文件,执行完这一步数据库中还没有数据表)
执行命令(在项目目录下)

python manage.py makemigrations

(2)执行迁移(执行完这一步,数据库多了12个表,其中就有myapp_grades、myapp_students)

 python manage.py migrate

7.测试数据操作

(1)进入python shell
    执行代码  python manage.py shell
(2)引入一些包
    from myApp.models import Grades,Students
    from django.utils import timezone
    from datetime import *
(3)查询所有数据(类名.objects.all())
    Grades.objects.all()
(4)添加数据(本质:创建一个模型类的对象实例)
例如:
    grade1 = Grades()
    grade1.gname = "信管一班"
    grade1.gdate = datetime(year=2017,month=8,day=10)
       在这一步时可能会有警告RuntimeWarning: DateTimeField Grades.gdate received a naive datetime (2017-08-10 00:00:00) while time zone support is active.
        解决方法:在settings.py 文件中设置 USE_TZ = False 警告错误不再报
    grade1.ggirlnum = 13
    grade1.gboynum = 20
    //保存到数据库(模型和数据库交互)
    grade1.save()
    查看是否添加,在shell终端可 Grades.objects.all() ,或在数据库中操作 select * from myapp_grades
        在shell终端看非常麻烦,可以在models.py中的Grades模型添加函数
        (添加完之后 1.需要重启shell 2.重新导入那三个包 3.执行 Grades.objects.all())
        def __str__(self):
            return "%s__%d__%d"%(self.gname,self.ggirlnum,self.ggirlnum)
(5)查看某个对象
    pk=2  就是查询第二个对象(pk = primary key(主键))
    Grades.objects.get(pk=2)
(6)修改数据
    模型对象.属性 = 新值
    例如:
        grade2.gboynum = 99
        grade2.save()     //切记要save()
(7)删除数据
    模型对象.delete()
    例如:(这是物理删除,删除数据库中的表)
        grade2.deleta()

8.关联对象a

(1)代码:
grade1 = Grades.objects.get(pk=1)
stu1 = Students()
stu1.sname = "小王"
stu1.sgender = True
stu1.sage = 20
stu1.scontend = "你好,我叫小王。"
stu1.sgrade = grade1
stu1.save()
执行完毕后在mysql查询语句 select * from myapp_students; 可以发现sgrade字段写了关联Grades类的grade的值。
(2)获得关联对象集合   " 对象名.关联的类的小写_set.all() "
    -1- 先建立stu2对象
        stu2 = Students()
        stu2.sname = "小张"
        stu2.sage = 22
        stu2.scontend = "你好,我叫老张。"
        stu2.sgrade = grade1
        stu2.save()
    -2- 在shell中执行 grade1.students_set.all() 会发现可以查询到两个对象分别是 stu1、stu2
(3)创建一个属于grade1班级的学生stu3
    stu3 = grade1.students_set.create(sname = u'小李', sage = 30, sgender = False, scontend = u'大家好,我是小李。')
    注意:u是转码,而且不用save()操作

9.启动服务器(开发测试使用的轻量级web服务器)

格式: python manage.py runserver ip:port
        ip和port可以不写,分别默认为 本机 和 8000

10.Admin站点管理

(1)概述:
    内容发布:负责添加删除修改内容
    公告访问
(2)配置Admin应用(在setting.py文件中的INSTALLED_APPS添加'django.contrib.admin')默认是有的,可忽略
(3)创建管理员用户
    执行:python manage.py createsuperuser
    然后依次输入用户名、email、密码
    在浏览器中直接输入网址 http://127.0.0.1:8000/admin 进入
(4)汉化
在settings.py文件中修改如下,修改完后直接刷新浏览器,不必重启服务器。
    # LANGUAGE_CODE = 'en-us'
    LANGUAGE_CODE = 'zh-Hans'
    # TIME_ZONE = 'UTC'
    TIME_ZONE = 'Asia/Shanghai'

11.管理数据表

(1)修改admin.py文件
    from .models import Grades,Students
    # 注册方法1
    admin.site.register(Grades)
    admin.site.register(Students)
    # 注册方法2(使用装饰器注解)
    @admin.register(Grades)
    @admin.register(Students)
(2)刷新浏览器
(3) -1- 自定义管理页面
    class GradeAdmin(admin.ModelAdmin):
        #列表页属性
        list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete']   //显示字段名
        list_filter = ['gname']    //过滤字段
        search_fields = ['gname']  //搜索字段
        list_per_page = 5  //分页,每5个数据一页
        #添加修改页属性(fields 和 fieldsets 不能同时使用)
        #fields = ['gname','ggirlnum','gboynum','gdate','isDelete']         //规定属性的先后顺序,没有pk
        fieldsets = [
        ("base",{"fields":['gname','gdate','isDelete']}),
        ("num",{"fields":['ggirlnum','gboynum']})
    ]    //给属性分组
    注意要加GradesAdmin类
    admin.site.register(Grades, GradesAdmin)
    -2- 关联对象
    在 可视化页面 创建班级时可以直接添加几个学生
    class StudentInfo(admin.TabularInline):
        model = Students
        extra = 2
    但是要在Grades类中添加 inlines = [StudentInfo]
    -3- 布尔值显示问题(以性别为例)
        def gender(self):
            if self.sgender:
                return "男"
            else:
                return "女"
            # 设置页面列的名称
        gender.short_description = "性别"
        list_display = ['pk','sname','sage',gender,'scontend','sgrade','isDelete']
    -4- 执行动作的位置
        action_on_top = False
        action_on_bottom = True

13.视图的基本使用

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

(1)定义视图(views.py):

from django.http import HttpResponse
def index(request):
    return HttpResponse("我的第一个django项目!!!")

(2)配置url

    -1- 修改project目录下的urls.py文件
 from django.contrib import admin
 from django.urls import path,include
 urlpatterns = [
     path('admin/', admin.site.urls),
     path('', include('myApp.urls')),
 ]
    -2- 在myApp应用目录下创建一个urls.py文件
from django.urls import path
from . import views
 urlpatterns = [
     path(r'',views.index())
 ]

14.模板的基本使用

概述:模板是html页面,可以根据视图中传递来的数据进行填充。

-1- 创建模板目录

    创建templates目录,在目录下创建对应的模板目录(django/first_project/templates/myApp)

-2- 配置模板路径(修改settings.py文件下的TEMPLATES)

TEMPLATES = [
        {
            'DIRS': [os.path.join(BASE_DIR,'templates')],
        },
    ]

-3- 新建 grades.html 和 students.html

    模板语法:
        1.{{输出值,可以是变量,也可以是一个对象.属性}}
        2.{%执行代码%}

-4- http://127.0.0.1:8000/grades

		a 写grades.html模板
<h1>班级信息</h1>
<ul>
    {%for grade in grades%}
    <li>
        <a href="#">{{grade.gname}}</a>
    </li>
    {%endfor%}
</ul>
		b 定义视图
 from .models import Grades
            def grades(request):
                # 在模板里取数据
                gradeslist = Grades.objects.all()
                # 将数据传给模板,模板再渲染页面,视图将渲染好的页面返回浏览器
                return render(request,'myApp/grades.html',{"grades":gradeslist})
		c 配置url路径(配置myApp下的urls.py就行)
 path('grades',views.grades)

-5- 点击班级,显示对应的班级的所有学生

    a 定义视图  代码如下:
 def gradesstudents(request,number):
	 #获得对应班级对象
	 grade = Grades.objects.get(pk=number)
	 #获得班级下的所有学生
	 studentslist = grade.students_set.all()
	 return render(request, 'myApp/students.html',{"students":studentslist})
    b 配置url
path('grades/<int:number>',views.gradesstudents)
    c 模板
 <li>
     <a href="grades/{{grade.id}}">{{grade.gname}}</a>
 </li>
发布了4 篇原创文章 · 获赞 0 · 访问量 106
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览