博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新建Django配置
阅读量:6402 次
发布时间:2019-06-23

本文共 13422 字,大约阅读时间需要 44 分钟。

 

一  :新建django的配置

准备工作,先在数据库中创建一个库,并指定utf8编码

 

1
CREATE DATABASE IF NOT EXISTS student default character 
set 
utf8 COLLATE utf8_general_ci;

 

  

 

在项目下的settings.py配置文件下配置数据库

1
2
3
4
5
6
7
8
9
DATABASES 
= 
{
    
'default'
: {
        
'ENGINE'
'django.db.backends.mysql'
,
        
'NAME'
'student'
,
        
'USER'
'root'
,
        
'PASSWORD'
'123123'
,
        
'HOST'
'192.168.244.10'
,
        
'PORT'
'3306'
,
    
}<br>}

__init__.py文件的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import 
pymysql
pymysql.install_as_MySQLdb()
 
#打开数据库链接
db 
= 
pymysql.connect(
"192.168.244.10"
,
"root"
,
"123123"
,
"student"
)
 
#使用cursor()方法获取游标
cursor 
= 
db.cursor()
 
cursor.execute(
"SELECT VERSION()"
)
 
data 
= 
cursor.fetchone()
 
print
(
"Database version : %s" 
% 
data)
 
db.close()

 测试一下和数据库的连通性

1
python manage.py runserver <br>完了以后先退出终端,先不启动

***************************************

二 .创建一个应用,并激活

1
python manage.py startapp myApp

创建项目后在settings.py文件中添加项目

激活其实就是这一步的添加过程

1
2
3
4
5
6
7
8
INSTALLED_APPS 
= 
[
    
'django.contrib.admin'
,
    
'django.contrib.auth'
,
    
'django.contrib.contenttypes'
,
    
'django.contrib.sessions'
,
    
'django.contrib.messages'
,
    
'django.contrib.staticfiles'
,
    
'myApp'

 在模板中定义和数据表相对应的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class 
Grades(models.Model):
    
gname 
= 
models.CharField(max_length
=
20
)
    
gdate  
= 
models.DateField()
    
ggirlnum 
= 
models.IntegerField()
    
gboynum 
= 
models.IntegerField()
    
isDelete 
= 
models.BooleanField(default
=
False
)
    
def 
__str__(
self
):
        
return 
"%s-%d-%d" 
%
(
self
.gname,
self
.ggirlnum,
self
.gboynum)
 
 
class 
Student(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)

 

 

 

在数据库中生成数据表:

要在数据库中生成数据,先要生成一个迁移文件,并执行迁移文件

创建上面的应用myApp后,会在myApp下生成migrations目录

1
python manage.py makemigrations<br><br><br>python manage.py migrate

  

 

 

三 :在终端测试模板和数据库交互的情况(创建数据)

1
2
3
4
5
6
进入django的shell环境
E:\老男孩课程\tudent>python manage.py shell
###########################################
>>> 
from 
myApp.models 
import 
Grades,Student
>>> 
from 
django.utils 
import 
timezone
>>> 
from 
datetime 
import 
*
1
from 
myApp.models 
import 
Grades,Student
1
from 
django.utils 
import 
timezone
1
from 
datetime 
import 
*
1
2
3
4
5
<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 
通过模型类查看数据
>>> Grades.objects.
all
()
1
Grades.objects.
all
()
1
2
3
4
5
6
7
8
9
10
11
12
13
<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
添加一条数据的本质
本质:创建一个模型类的对象
 
 
 
>>> grade1 
= 
Grades()
>>> grade1.gname 
= 
"python04"
>>> grade1.gdate 
= 
datetime(year
=
2017
,month
=
11
,day
=
17
)
>>> grade1.ggirlnum 
= 
3
>>> grade1.gboynum 
= 
70
>>> grade1.save()<br><br>
1
grade1 
= 
Grades()
1
grade1.gname 
= 
"python04"
1
grade1.gdate 
= 
datetime(year
=
2017
,month
=
11
,day
=
17
)
1
grade1.ggirlnum 
= 
3
1
grade1.gboynum 
= 
70
1
grade1.save()
1
<br><br>
1
<br><br>

----------------------------------------------------------------------------------------------

>>> grade2 = Grades()
>>> grade2.gname = "python05"
>>>
>>>
>>> grade2.gdate = datetime(year=2017,month=11,day=30)
>>> grade2.ggirlnum = 8
>>> grage2.gboynum = 66
>>> grade2.gboynum = 72
>>> grade2.save()

grade2 = Grades()

grade2.gname = "python05"

grade2.gdate = datetime(year=2017,month=11,day=30)

grade2.ggirlnum = 8

grade2.gboynum = 66

grade2.gboynum = 72

grade2.save()

----------------------------------------------------------------------------------

  

四 :在shell环境查看生成的表数据(包括修改和删除数据)

退出重新进一次shell环境

1
2
3
4
5
6
7
8
9
10
11
12
quit()
 
python manage.py shell
 
#并重新导入三个库
>>> 
from 
myApp.models 
import 
Grades,Student
>>> 
from 
django.utils 
import 
timezone
>>> 
from 
datetime 
import 
*
 
 
通过模型类查看数据
>>> Grades.objects.
all
()<br><br>查看单个表中的数据

>>> Grades.objects.get(pk=1)

<Grades: python04-3-70>
>>> Grades.objects.get(pk=2)
<Grades: python05-8-72>

 

修改单个表中的数据

语法:模型对象.gboynum=值

>>> grade2.gboynum = 50

>>> grade2.save()

 

删除单个表中的数据(物理删除)

语法:模型对象.delete()

>>> grade2.delete()

(1, {'myApp.Student': 0, 'myApp.Grades': 1})

  

获得关联对象的集合

先创建两个学生表

1
2
3
4
5
6
7
>>> grade1
=
Grades.objects.get(pk
=
1
)
>>> stu1 
= 
Student()
>>> stu1.sname 
= 
"王福田"
>>> stu1.sgender 
= 
False
>>> stu1.sage 
= 
25
<br>
#如下,指点班级列等于另外一个表的对象,就会自动关联
>>> stu1.sgrade 
= 
grade1 
>>> stu1.save()
1
grade1
=
Grades.objects.get(pk
=
1
)
1
stu1 
= 
Student()
1
stu1.sname 
= 
"王福田"
1
stu1.sgender 
= 
False
1
stu1.sage 
= 
25
1
stu1.sgrade 
= 
grade1
1
stu1.save()<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1
2
3
4
5
6
7
<br>
>>> stu2 
= 
Student()
>>> stu2.sname 
= 
"张宝来"
>>> stu2.sgender 
= 
False
>>> stu2.sage 
= 
30
>>> stu2.sgrade 
= 
grade1
>>> stu2.save()<br><br>
1
stu2 
= 
Student()
1
stu2.sname 
= 
"张宝来"
1
stu2.sgender 
= 
False
1
stu2.sage 
= 
30
1
stu2.sgrade 
= 
grade1
1
stu2.save()<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1
<br><br><br>查看班级有哪些学生:<br>因为没有重写类的
return
,所以返回的不是数据<br>另外,_set.
all
是django自带的一个方法,虽然我没有定义,但是也可以使用

>>> grade1.student_set.all()

<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
>>>

  

一条命令创建学生并关联主键

不用save,直接存入数据库

1
>>> stu3
=
grade1.student_set.create(sname
=
u
'zhangsan'
,scontend
=
u
'my name is zhangsan'
,sage
=
45
)

  

在maApp文件夹下的models.py文件中编写一个函数,用于返回数据值

1
2
3
4
5
6
7
8
class 
Grades(models.Model):
    
gname 
= 
models.CharField(max_length
=
20
)
    
gdate  
= 
models.DateField()
    
ggirlnum 
= 
models.IntegerField()
    
gboynum 
= 
models.IntegerField()
    
isDelete 
= 
models.BooleanField(default
=
False
)
    
def 
__str__(
self
):
        
return 
"%s-%d-%d" 
%
(
self
.gname,
self
.ggirlnum,
self
.gboynum)

  

五 .启动服务器

1
2
3
python manage.py runserver  ip:port
如果是本机可以不写,默认是本机ip,端口是
8000
python manage.py runserver

  

五. 站点管理

在另外一个终端,创建超用户

1
python manage.py createsuperuser<br><br>

  

在setting.py文件中修改字符集和时间

1
2
3
LANGUAGE_CODE 
= 
'zh-Hans'
 
TIME_ZONE 
= 
'Asia/Shanghai'

  

管理数据表

在admin.py文件中对表进行注册

注册以后刷新http://127.0.0.1:8000/admin/页面,会出现已经注册上的表

1
2
3
4
5
from 
.models 
import 
Grades,Student
 
#注册
admin.site.register(Grades)
admin.site.register(Student)

  

 5.1 站点自定义管理

在应用的admin.py文件中定义

1
2
3
4
5
6
7
from 
.models 
import 
Grades,Student
class 
GradesAdmin(admin.ModelAdmin):
    
#列表页属性
    
list_display 
= 
[
'gname'
,
'gdate'
,
'ggirlnum'
,
'gboynum'
,
'isDelete'
]
    
# list_filter = ['gname']
    
# search_fields = []
    
# list_per_page = []
class StudentAdmin(admin.ModelAdmin):     list_display = ['sname','sgender','sage','sgrade','isDelete','scontend']     list_per_page = 2
  #添加,修改列表也属性   #可以规定先后顺寻,   #这两个属性不能同时使用   # fields =['ggirlnum','gboynum','gdate','isDelete']   # fieldsets = [   #     ("num",{"fields":['ggirlnum','gboynum']}),   #     ("base",{"fields":['gname','gdate','isDelete']})   # ]
1
admin.site.register(Grades,GradesAdmin) 
#要点,这个后面怎加了GradesAdmin,否则上面的属性不会用到 admin.site.register(Student)<br><br>
admin.site.register(Student,StudentAdmin)

  

5.2 小需求练习

在原来的admin.py配置文件中加入StudentInfo类,并在GradeAdmin类中加入inlines属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class 
StudentInfo(admin.TabularInline):
    
#使用模板中的哪个类
    
model 
= 
Student
    
#自动添加几个
    
extra 
= 
2
class 
GradesAdmin(admin.ModelAdmin):
    
inlines 
= 
[StudentInfo]
    
#列表页属性
    
list_display 
= 
[
'gname'
,
'gdate'
,
'ggirlnum'
,
'gboynum'
,
'isDelete'
]
    
#过滤条件
    
list_filter 
= 
[
'gname'
]
    
#搜索字段
    
search_fields 
= 
[
'gname'
]
    
#分页
    
# list_per_page = 2

  

5.3布尔值的显示问题

男女显示的问题

1
2
3
4
5
6
class 
StudentAdmin(admin.ModelAdmin):
    
def 
gender(
self
):
        
if 
self
.sgender:
            
return 
"男"
        
else
:
            
return 
"女"
<br>   
#设置页面列的名称 gender.short_description = "性别"
1
list_display 
= 
[
'pk'
,
'sname'
,
'gender'
,
'sage'
,
'sgrade'
,
'isDelete'
,
'scontend'
] list_per_page 
= 
10

5.4执行动作的位置问题(action的问题)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class 
StudentAdmin(admin.ModelAdmin):
    
# def gender(self):
    
#     if self.sgender:
    
#         return "男"
    
#     else:
    
#         return "女"
    
#设置页面列的名称
    
# gender.short_description = "性别"
  
   
#就是设置action的布尔值
    
actions_on_bottom 
= 
True
    
actions_on_top 
= 
False
    
list_display 
= 
[
'pk'
,
'sname'
,
'gender'
,
'sage'
,
'sgrade'
,
'isDelete'
,
'scontend'
]
    
list_per_page 
= 
10
admin.site.register(Grades,GradesAdmin)
admin.site.register(Student,StudentAdmin)

  

5.5使用装饰器完成注册

1
以后都用装饰器来完成注册<br><br><br>@admin.register(Student)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class 
StudentAdmin(admin.ModelAdmin):
    
# def gender(self):
    
#     if self.sgender:
    
#         return "男"
    
#     else:
    
#         return "女"
    
#设置页面列的名称
    
# gender.short_description = "性别"
  
   
#就是设置action的布尔值
    
actions_on_bottom 
= 
True
    
actions_on_top 
= 
False
    
list_display 
= 
[
'pk'
,
'sname'
,
'gender'
,
'sage'
,
'sgrade'
,
'isDelete'
,
'scontend'
]
    
list_per_page 
= 
10
<br><br>把调用注释掉
1
#admin.site.register(Student,StudentAdmin)

  

六,视图

视图其实就是一个函数,在创建的app中的vews.py文件中添加

1
2
3
4
5
from 
django.shortcuts 
import 
render
from 
django.http 
import 
HttpResponse
# Create your views here.
def 
index(request):
    
return 
HttpResponse(
"sunck is a good man"
)

  

按照django架构,http请求过来是先找url,url在找视图,所以我们这里先配置url控制器

urls.py文件默认在项目student目录下,除此之外,我们需要在新建的应用myApp目录中也建一个urls.py文件,所以总共加起来有两个urls.py文件

这里我们先配置默认已经存在的urls.py文件

1
2
3
4
5
6
7
from 
django.contrib 
import 
admin
from 
django.conf.urls 
import 
include,url
 
urlpatterns 
= 
[
    
url(r
'admin/'
, admin.site.urls),
    
url(r
'^'
,include(
'myApp.urls'
)),
]

 

 

接下来修改刚创建的myApp文件下的urls.py文件

1
2
3
4
5
from 
django.conf.urls 
import 
url
from 
import 
views
urlpatterns 
= 
[
    
url (r
'^$'
, views.index)
]

  

七,模板

模板是html页面

根据视图中传递过来啦的数据,进行填充

7.1创建模板目录

在templates目录下创建目录,templates和myApp,student,manage,py都是同级的

在templates目录下创建对应的应用的目录

 

7.2配置模板路径

在settings.py文件

其中basedir指的就是myApp,student,manage,py这几个所在的文件夹的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TEMPLATES 
= 
[
    
{
        
'BACKEND'
'django.template.backends.django.DjangoTemplates'
,
        
'DIRS'
: [os.path.join(BASE_DIR, 
'templates'
)]
        
,
        
'APP_DIRS'
True
,
        
'OPTIONS'
: {
            
'context_processors'
: [
                
'django.template.context_processors.debug'
,
                
'django.template.context_processors.request'
,
                
'django.contrib.auth.context_processors.auth'
,
                
'django.contrib.messages.context_processors.messages'
,
            
],
        
},
    
},
]

  

7.3小需求练习,我要展示http://172.0.0.1:8000/grade

先定义模板,我的html长什么样

在templates下的myApp下新建一个html文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
    
<meta charset
=
"UTF-8"
>
    
<title>班级<
/
title>
<
/
head>
<body>
    
<h1>
        
{
% 
for 
grade 
in 
grades
%
}
        
<li>
            
<a href
=
"#"
>{
{ grade.gname }}<
/
a>
        
<
/
li>
        
{
% 
endfor 
%
}
    
<
/
h1>
<
/
body>
<
/
html>

  

 

7.3.1模板语法;

语法1:{

{输出值,可以是变量,也可以是对象.属性}}

语法2:{%代码段%}

 

7.3.2, 定义视图

视图从模板中取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
from 
django.shortcuts 
import 
render
from 
django.http 
import 
HttpResponse
# Create your views here.
def 
index(request):
    
return 
HttpResponse(
"sunck is a good man"
)
 
 
from 
.models 
import 
Grades
def 
grades(request):
    
#去模板里取数据
    
gradesList
=
Grades.objects.
all
()
    
#将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器,下面字典里的grades就是html中的变量
    
return 
render(request,
'myApp/grades.html'
,{
"grades"
:gradesList})

 

7.3.3  设置url,

浏览器通过url来找视图

因为上面最外层的url已经包含了应用层的url,所以直接在最里面的urls.py文件中配置视图

1
2
3
4
5
6
7
from 
django.conf.urls 
import 
url
from 
import 
views
urlpatterns 
= 
[
    
url (r
'^$'
, views.index),
    
#如果没有视图,则要导入
    
url(r
'^grades/$'
,views.grades)
]

  

 7.4 小需求,在原来的基础上,展示班级下面的所有学生

定义视图

1
2
3
4
5
6
7
8
9
10
11
from 
.models 
import 
Student
def 
students(request):
    
studentsList
=
Student.objects.
all
()
    
return 
render(request,
'myApp/student.html'
,{
"students"
:studentsList})
 
def 
gradesStudents(request,num):
    
#获得对应的班级对象
    
grade
=
Grades.objects.get(pk
=
num)
    
#获得班级下的所有学生
    
studentsList 
= 
grade.student_set.
all
()
    
return 
render(request,
'myApp/student.html'
,{
"students"
:studentsList})

  

添加url

1
2
3
4
5
6
7
8
9
from 
django.conf.urls 
import 
url
from 
import 
views
urlpatterns 
= 
[
    
url (r
'^$'
, views.index),
    
#如果没有视图,则要导入
    
url(r
'^grades/$'
,views.grades),
    
url(r
'students/$'
,views.students),
    
url(r
'^grades/(\d+)$'
,views.gradesStudents)
]

  

创建学生的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
    
<meta charset
=
"UTF-8"
>
    
<title>学生信息<
/
title>
<
/
head>
<body>
    
<h1>
        
<ul>
            
{
% 
for 
student 
in 
students 
%
}
             
<li>
                
{
{ student.sname }}
-
-
{
{ students.scontend }}
             
<
/
li>  
            
{
% 
endfor 
%
}
        
<
/
ul>
    
<
/
h1>
<
/
body>
<
/
html>

  

 同时修改班级的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
    
<meta charset
=
"UTF-8"
>
    
<title>班级<
/
title>
<
/
head>
<body>
    
<h1>
        
{
% 
for 
grade 
in 
grades
%
}
        
<li>
            
<a href
=
"{
{ grade.id }}"
>{
{ grade.gname }}<
/
a>
        
<
/
li>
        
{
% 
endfor 
%
}
    
<
/
h1>
<
/
body>
<
/
html>

 

八:移动数据库以后,删除迁移文件,在生成一次迁移文件,再执行

ll

九。补充,ORM映射关系

O:模型   R:映射   M:数据库

 

十.模型类,属性,表,字段的关系

一个模型类在数据库中对应一张表,模型类的属性在与之对应的表中对应一个字段

模型类中的属性

学习链接:https://blog.csdn.net/qq_34493908/article/details/80388041

 十一,创建模型管理器

先修改模型类

 
修改了模型类

 

再准备数据,重新迁移一次数据

1
2
3
4
5
6
7
8
9
10
11
12
13
insert into grades(gname,gdate,ggirlnum,gboynum,isDelete)
values(
"python01"
,
"2018-2-3"
,
22
,
34
,
0
),
(
"python02"
,
"2018-2-2"
,
27
,
34
,
0
),
(
"python03"
,
"2018-2-30"
,
22
,
34
,
0
),
(
"python04"
,
"2018-2-30"
,
22
,
34
,
0
);
         
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
insert into student(sname,sgender,scontend,isDelete,sgrade_id,sage,lastTime,creatTime) values(
"薛延美"
,
1
,
"薛延美"
,
0
,
4
,
20
,
"2018-2-3"
,
"2018-2-3"
),
(
"王占山"
,
1
,
"我叫网站山"
,
0
,
4
,
20
,
"2018-2-3"
,
"2018-2-3"
),
(
"李婷"
,
1
,
"我叫李婷"
,
0
,
4
,
20
,
"2018-2-3"
,
"2018-2-3"
),
(
"赵本山"
,
1
,
"我叫赵本山"
,
0
,
4
,
20
,
"2018-2-3"
,
"2018-2-3"
),
(
"刘大河"
,
1
,
"我叫刘大河"
,
0
,
4
,
20
,
"2018-2-3"
,
"2018-2-3"
),
(
"刘德华"
,
1
,
"我叫刘德华"
,
0
,
4
,
20
,
"2018-2-3"
,
"2018-2-3"
);

转载于:https://www.cnblogs.com/WHWWHW/p/10940337.html

你可能感兴趣的文章
互联网人出游必备清单
查看>>
Golang环境搭建
查看>>
《程序员的呐喊》一一1.5 作者手记:神秘机器的笔记
查看>>
《AutoCAD 2013中文版从入门到精通》——1.3 配置绘图系统
查看>>
《深入理解ElasticSearch》——2.8 ElasticSearch切面机制中的过滤器与作用域
查看>>
Mozilla 开源 web 虚拟现实框架 A-Frame
查看>>
Libreboot 申请重新加入 GNU
查看>>
《伟大的计算原理》一总结
查看>>
开源笔记本 Novena 将支持宽频软件无线电
查看>>
程序员怎样才能找到一个靠谱的创业公司
查看>>
《实施Cisco统一通信VoIP和QoS(CVOICE)学习指南(第4版)》一第1章 介绍语音网关...
查看>>
ZFS On Linux 现状,是否足够稳定了?
查看>>
《OpenCV图像处理》——2.5 算术运算
查看>>
《嵌入式 Linux C 语言应用程序设计(修订版)》——导读
查看>>
YurunHttp V1.3.3 发布,支持 composer
查看>>
Ubuntu LTS 16.04 开发进入功能冻结阶段
查看>>
《企业大数据系统构建实战:技术、架构、实施与应用》一第2章 企业大数据职能规划2.1 大数据组织架构体系...
查看>>
《手机测试Robotium实战教程》—第2章2.4节ADT插件的安装
查看>>
《架构真经:互联网技术架构的设计》分而治之
查看>>
发展型机器人:由人类婴儿启发的机器人. 2.2 机器人学简介
查看>>