基本操作
前期准备:
- 创建工程的两种方法:
①直接打开pycharm,点击file →newprocject
②打开黑屏终端,进入想创建的模流下:django-admin startproject project - 创建一个数据库:
在黑屏终端的中进入mysql:create database 数据库名称
一、创建应用
进入所建工程目录,运行cmd
D:\01-firstweb\firstproject>python manage.py startapp myApp
查看新建应用:
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
五、在数据库中生成数据表
-
生成迁移文件
(迁移文件在migrations中,此时只是在migrations生成了一个迁移文件,数据库中还没表)
进入fiestproject目录下,执行python manage.py makemigrations
-
执行迁移
在firstproject目录下,执行python manage.py migrate
-
错误合集:
①生成文件错误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 注释掉即可 -
重复迁移与执行
如发现模型建立的不好,想重新迁移,需要将此时数据库中的表全部删除,(若删除不了表,可以删除整个数据库,并重建)并在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站点管理
- 配置Admin应用
在settings.py文件中的INSTALLED_APPS中添加’djang.contribe.admin’ (默认情况下已添加) - 创建管理员用户
进入工程目录,运行:python manage.py createsuperuser
依次输入用户名,邮箱,密码(太短直接跳过)
查看 打开浏览器,进入http://127.0.0.1:8000/admin/ 输入用户名密码 - 页面汉语化
在settings.py的111行找到
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
换成
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/shanghai'
- 管理数据表
①修改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)
九、视图的基本使用
- 概述:在django中,视图对web的请求进行回应,视图就是一个在view.py中定义的python函数
- 在view.s中定义视图:
from django.http import HttpResponse
def index(resquest):
return HttpResponse("视图定义成功")
- 配置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中的函数
]
十、模板的基本使用
- 概述:模板是html页面可以根据视图中传递过来的数据进行填充
- 创建模板目录:在工程下建一个和myapp同级的目录templates,在templates下再创建一个名为myapp的目录
- 配置模板目录:在settings.py中的TEMPLATES中修改
'DIRS': [os.path.join(BASE_DIR,'templates')],
- 定义模板:在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})
- 配置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函数
]
- 实现关联(网页点击班级,显示对应班级内学生信息)
学生和班级的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地址事要用“/”否则会报错
效果展示