1.django基本流程

基本操作

在这里插入图片描述

前期准备:

  1. 创建工程的两种方法:
    ①直接打开pycharm,点击file →newprocject
    ②打开黑屏终端,进入想创建的模流下:django-admin startproject project
  2. 创建一个数据库:
    在黑屏终端的中进入mysql:create database 数据库名称

一、创建应用

进入所建工程目录,运行cmd

 D:\01-firstweb\firstproject>python manage.py startapp myApp

查看新建应用:
admin.py→站点配置models.py→模型设置views.py→视图设置
admin.py→站点配置
models.py→模型设置
views.py→视图设置

二、激活应用

在 settings.py的文件中,将myAPP添加到INSTALLED_APPS中
在这里插入图片描述

三、配置数据库(配置过的无须配置)

Django 默认使用sqlite数据,在 settings.py的datenase中查看,大概76行
配置mysql:
①打开pycharm的工程,进入project的_init__.py中写两行代码:

import pymysql        #Django连接MySQL时默认使用MySQLdb驱动,但MySQLdb不支持Python3,因此这里将MySQL驱动设置为pymysql,
pymysql.install_as_MySQLdb()

②在settings.py中找到DATABASES,写入代码

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',#配置数据库,将sqlite3换成mysql
'NAME':  'hxy',#数据库名
'USER':'root',#用户名
'password':'******',#密码
'host':'localhost',#主机,或者127.0.0.1
'port':'3306',#pymysql的默认口号为3306
}

四、根据表结构定义模型

一个数据表对应一个模型,要在models.py中设置模型
1.引入包from django.db import models
2.建立表-模型(继承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)
    def __str__(self):
        return self.gname#返回班级名称
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", on_delete=models.CASCADE)
    def __str__(self):
        return self.sname

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

  1. 生成迁移文件
    (迁移文件在migrations中,此时只是在migrations生成了一个迁移文件,数据库中还没表)
    进入fiestproject目录下,执行python manage.py makemigrations

  2. 执行迁移
    在firstproject目录下,执行python manage.py migrate

  3. 错误合集:
    ①生成文件错误1:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
    解决方法:进入E:\python\Lib\site-packages\Django-3.0.3-py3.8.egg\django\db\backends\mysql\base.py文件中,将如下代码注释掉(大概在第36行)if version < (1, 3, 13):
    raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)
    ②生成文件错误2: init() missing 1 required positional argument: ‘on_delete’
    错误分析:由于django版本不同,所用语法不同,在django2.0中关联外键与1.0中不同
    解决方法:在错误代码后面加:on_delete = models.CASCADE
    #即sgrade = models.ForeignKey(“Grades”,on_delete = models.CASCADE)#关联外键
    ①执行迁移错误1:错误1:django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, “You have an error in your SQL syntax; check the manual that corresponds to y
    our MySQL server version for the right syntax to use near ‘(6) NOT NULL)’ at line 1”))
    解决方法:我所使用的mysql5版本太低,语法出现错误,卸掉装高版本8.0
    ②执行迁移错误2:pymysql.err.OperationalError: (2003, “Can’t connect to MySQL server on ‘127.0.0.1’ ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)”)
    解决方法、:进入服务发现mysql启动后即可,但我出现启动后马上自动关闭,无法正常启动。解决方法:→进入C:\Program Files\MySQL\MySQL Server 8.0/my.ini文件,将第40行的skip-grant-tables 注释掉即可

  4. 重复迁移与执行
    如发现模型建立的不好,想重新迁移,需要将此时数据库中的表全部删除,(若删除不了表,可以删除整个数据库,并重建)并在pycham中删除迁移文件,否则会出错: Apply all migrations: admin, auth, contenttypes, myApp, sessions
    Running migrations:
    No migrations to apply.

六、测试数据

1.进入fiestproject目录,执行python manage.py shell
2.引入一系列包:

from myApp.models import Grades 
from django.utils import timezone 
from datetime import *

注意:每次进入shell后都需引入这一系列包。否则会报错。
①查询所有数据:
>>> Grades.objects.all() #类名.objects.all()
注意:此时的类名区分大小写,否则显示没定义
②添加数据(创建一个模型类的对象实例):

>>> gradel = Grades()
>>> gradel.gname = "17wu1"
>>> gradel.gdate = datetime(year = 2017,month = 7,day =9)
>>> gradel.ggirlnum = 14
>>> gradel.gboynum = 37
>>> gradel.save()

③查看某个对象:

Grades.objects.get(pk=2) #查看第二个对象

④修改数据:

grade2.gboynum = 50 #格式:模型对象.属性 = 新值
grade2.save()

⑤删除数据

grade2.delete()#格式:模型对象.delete()

注意:这种删除为物理删除
⑥关联对象(创建某班的某学生)
1> 创建方法1:

>>> Students()
<Students: Students object (None)>
>>> stu = Students()
>>> stu.sname = "狗蛋儿"
>>> stu.sgender = False
>>> stu.sage = 18
>>> stu.scontend = "hello"
>>> stu.sgrade = grade1  #此处为关联,将学生“狗蛋儿”关联到“grade1”班
>>> stu.save()

2> 创建方法2:

 stu2 = grade1.students_set.create(sname = u"王辉",sage=20,scontend="我叫王狗蛋儿")     

3>错误合集:
错误1:stu = Students()
Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘Students’ is not defined
错误分析:此错误为students未被定义,但是models中对students()有明确定义,此时只要重新在cmd中导入student(即可)
解决办法:

>>> from myApp.models import *
>>> Student()

4>获取关联对象的集合:
如:获取17物1所有学生

>>> grade1.students_set.all()   #格式:对象名.关联的类名小写_set.all()
<QuerySet [<Students: Students object (1)>, <Students: Students object (2)>]>

七、启动服务器

在工程目录下执行:python manage.py runserver
格式:python manage.py runserver ip:port (不写ip的话,默认本地ip,port默认为8000)

然后打开浏览器在地址栏输入http://127.0.0.1:8000/
在这里插入图片描述注意;这里的sever服务是一个纯python写的轻量级服务器,仅用于开发测试使用,真正发布后还是用Apache

八、Admin站点管理

  1. 配置Admin应用
    在settings.py文件中的INSTALLED_APPS中添加’djang.contribe.admin’ (默认情况下已添加)
  2. 创建管理员用户
    进入工程目录,运行:python manage.py createsuperuser
    依次输入用户名,邮箱,密码(太短直接跳过)
    查看 打开浏览器,进入http://127.0.0.1:8000/admin/ 输入用户名密码
  3. 页面汉语化
    在settings.py的111行找到
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'

换成

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/shanghai'
  1. 管理数据表
    ①修改admin.py文件
    from.models import Grades,Students#注册
    admin.site.register(Grades)
    admin.site.register(Students)
    ②自定义管理
    1>,关联对象:
    创建班级时在加两个学生:在admin中添加:
class StudentsInfo(admin.TabularInline):
model = Students
extra = 2

2>.布尔值设置
在admin中添加

    class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return '男'
else:
return '女'
gender.short_description = "性别"

3>.执行动作位置
在admin中添加:

 actions_on_bottom = True
actions_on_top = False
admin.site.register(Students,StudentsAdmin)

admin.py中的代码如下

from django.contrib import admin

# Register your models here.
from.models import Grades,Students

class StudentsInfo(admin.TabularInline):
    model = Students
    extra = 2
class GradesAdmin(admin.ModelAdmin):
   inlines = [StudentsInfo]
   list_display = ["pk","gname","gdate","ggirlnum","gboynum","isDelete"]
   list_filter = ["gname"]
   search_fields = ["gname"]
   list_per_page = 6

   #fields = ["ggirlnum","gboynum","gname","gdate","isDelete"]
   fieldsets = [
    ("num",{"fields":["ggirlnum","gboynum"]}),
    ("base",{"fields":["gname","gdate","isDelete"]}),
 ]

admin.site.register(Grades, GradesAdmin)

class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender:
            return '男'
        else:
            return '女'
    gender.short_description = "性别"

    list_display = ['pk','sname','sage',gender,'scontend','sgrade','isDelete']
    list_per_page = 3
    actions_on_bottom = True
    actions_on_top = False
admin.site.register(Students,StudentsAdmin)

九、视图的基本使用

  1. 概述:在django中,视图对web的请求进行回应,视图就是一个在view.py中定义的python函数
  2. 在view.s中定义视图:
from django.http import HttpResponse
def index(resquest):
return HttpResponse("视图定义成功")
  1. 配置UPL
    视图获取过程:浏览器发送请求→工程下url→app下url→views中视图引用
    ①修改工程下的主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下的url.py
]

②在myApp应用下创建一个url.py文件,并写入如下代码

from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$',views.index) #引入views.py中的函数
]

十、模板的基本使用

  1. 概述:模板是html页面可以根据视图中传递过来的数据进行填充
  2. 创建模板目录:在工程下建一个和myapp同级的目录templates,在templates下再创建一个名为myapp的目录
  3. 配置模板目录:在settings.py中的TEMPLATES中修改
'DIRS': [os.path.join(BASE_DIR,'templates')],
  1. 定义模板:在templates下的myapp的目录创建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>

模板语法:

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

如for循环写法:
{%for grade in grades%}
{%endfor%}
5. 在views.py中定义视图:

from .models import Grades
def grades(request):
#去模板取数据
gradesList = Grades.objects.all()
#将数据传递给模板,模板在渲染页面,再将渲染好的页面返回给浏览器
return render(request, 'myapp/grades.html', {"grades":gradesList})
#格式: return render(request, 'html文件(模板)路径', {"模板中的变量名":gradesList})

  1. 配置url
    ①先配置工程下的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下的url.py
]

②再配置myapp下的

urlpatterns = [
url(r'^$',views.index), #引入views.py中的函数
url(r'^(\d+)/$',views.detail),
url(r'^grades/$',views.grades) #引入view.py中的grades函数
]
  1. 实现关联(网页点击班级,显示对应班级内学生信息)
    学生和班级的html模板已有,此处无须定义
    定义视图
def gradesstudents(request,num):
#获得相应班级对象
grade = Grades.objects.get(pk=num)
#获得班级下所有学生对象
studentsList = grade.students_set.all()
return render(request,'myapp/syudents.html',{'students':studentsList})

配置url(在myapp的url.py中中添加如下语句)

url(r'^grades/(\d+)/$',views.gradesstudents)#班级id不同,用id标记班级,url获取到grades/班级id时,引入view.py中的gradesstudents函数

注意:写url地址事要用“/”否则会报错

效果展示
在这里插入图片描述
在这里插入图片描述

发布了7 篇原创文章 · 获赞 0 · 访问量 400

猜你喜欢

转载自blog.csdn.net/nanshashen/article/details/104626831