初始Django

初始Django

一、MVC和MTV模式

MVC:将web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。

模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。

Django的MTV模型本质上与MVC没有什么差别,也是各组件之间为了保持松耦合关系,只不过定义上有些不同,Django的MTV分别是:

  • Model(模型):负责业务对象与数据库的对象(ORM)
  • Template(模板):负责如何把页面展示给用户
  • View(视图):负责业务逻辑,并在适当的时候调用Model和Template

二、Django框架的安装与使用

1.安装

目前在企业开发中Django框架使用的主流版本为1.11.x版本,所有我们使用1.11.x版本的,不过现在最新版本为2.x 。

pip3 install django==1.11.18 #在命令行执行该命令

2.使用

如果使用的是我们自定义的框架来开发web应用,需要事先生成框架包含的一系列基础文件,
然后在此基础上进行开发。
如果使用的是Django框架来开发web应用,同样需要事先生成Django框架包含的一系列基础
文件,然后在此基础上进行开发。
但Django框架更为方便的地方在于它已经为我们提供了一系列命令来帮我们快速地生 成这一
系列基础文件。

#在命令行执行以下指令,会在当前目录生成一个mysite的文件夹,该文件夹中包含Django框架的一系列基础文件
django-admin startproject mysite

创建功能模块:

cd mysite  #切换到mysite目录下,执行以下命令
python mannage.py startapp  app01  #创建功能模块app01,此处的startapp代表创建application下的一个功能模块

运行:

python manage.py runserver  127.0.0.1:8080  #在浏览器输入:http://127.0.0.1:8080会看到Django的欢迎页面。

文件介绍:

  • manage.py  --- Django项目里面的工具,通过它可以调用django shell和数据库等
  • settings.py  --- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py --- 负责把url模式映射到应用程序

生成同步数据库的脚本:python manage.py makemigrations

同步数据库:python manage.py migrate

注意:开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个粗暴方法是将migrations目录下的脚本(除了__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。

3.admin

访问http://127.0.0.1:8000/admin/login/?next=/admin/时,需要为进入这个项目后台创建超级管理员:python manage.py createsuperuser,设置好账户密码就可以登陆。

(1)在admin文件执行如下配置

from django.contrib import admin
from app01 import models
# Register your models here.

admin.site.register(models.Book,BookAdmin)  #把某个表注册到admin的外部管理界面里
admin.site.register(models.Author)
admin.site.register(models.Publish)

(2)为数据表添加功能

from django.contrib import admin
from app01 import models
# Register your models here.

class BookAdmin(admin.ModelAdmin):
    list_display = ('id','name','price','pub_date')  #在Home>app01>Book 显示字段
    list_editable = ('name','price')   #设置Home>app01>Book 可以编辑字段
    filter_horizontal = ("authors",)   #在Home>app01>Book>Add book下使字段变成可以搜索
    list_per_page = 4  #设置Home>app01>Book 几条记录为一页
    search_fields = ('id','name','publish__name')  #在Home>app01>Book添加搜索字段
    list_filter = ('pub_date','publish')  #在Home>app01>Book添加过滤条件
    ordering = ('price',) #设置Home>app01>Book进行排序

admin.site.register(models.Book,BookAdmin)  #把某个表注册到admin的外部管理界面里
admin.site.register(models.Author)
admin.site.register(models.Publish)

admin字段参数:

    verbose_name        Admin中显示的字段名称
    blank               Admin中是否允许用户输入为空
    editable            Admin中是否可以编辑
    help_text           Admin中该字段的提示信息
    choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                        如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)

    error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                        字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                        如:{'null': "不能为空.", 'invalid': '格式错误'}

    validators          自定义错误验证(列表类型),从而定制想要的验证规则
                        from django.core.validators import RegexValidator
                        from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
                        MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
                        如:
                            test = models.CharField(
                                max_length=32,
                                error_messages={
                                    'c1': '优先错信息1',
                                    'c2': '优先错信息2',
                                    'c3': '优先错信息3',
                                },
                                validators=[
                                    RegexValidator(regex='root_\d+', message='错误了', code='c1'),
                                    RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
                                    EmailValidator(message='又错误了', code='c3'), ]
View Code

清空数据库:python manage.py flush

查询某个命令的详细信息:django-admin.py help startapp

启动交互界面:python manage.py shell(和直接运行python进入shell的区别是:你可以在这个shell里面调用当前项目的models.py中的API,对于操作数据,还有一些小测试非常方便)

终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>创建个人信息</h1>
 9 
10 <form action="/userInfor/" method="post">
11 
12     <p>姓名<input type="text" name="username"></p>
13     <p>性别<input type="text" name="sex"></p>
14     <p>邮箱<input type="text" name="email"></p>
15     <p><input type="submit" value="submit"></p>
16 
17 </form>
18 
19 <hr>
20 
21 <h1>信息展示</h1>
22 
23 <table border="1">
24 
25     <tr>
26         <td>姓名</td>
27         <td>性别</td>
28         <td>邮箱</td>
29     </tr>
30     {% for i in info_list %}
31 
32         <tr>
33             <td>{{ i.username }}</td>
34             <td>{{ i.sex }}</td>
35             <td>{{ i.email }}</td>
36         </tr>
37 
38     {% endfor %}
39 
40 </table>
41 
42 </body>
43 </html>
44 
45 
46 -----------------------url.py---------------------------------------
47 url(r'^userInfor/', views.userInfor)
48 
49 -----------------------views.py--------------------------------------
50 
51 info_list=[]
52 
53 def userInfor(req):
54 
55     if req.method=="POST":
56         username=req.POST.get("username",None)
57         sex=req.POST.get("sex",None)
58         email=req.POST.get("email",None)
59 
60         info={"username":username,"sex":sex,"email":email}
61         info_list.append(info)
62 
63     return render(req,"userInfor.html",{"info_list":info_list})
提交数据并展示
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>创建个人信息</h1>
 9 
10 <form action="/userInfor/" method="post">
11 
12     <p>姓名<input type="text" name="username"></p>
13     <p>性别<input type="text" name="sex"></p>
14     <p>邮箱<input type="text" name="email"></p>
15     <p><input type="submit" value="submit"></p>
16 
17 </form>
18 
19 <hr>
20 
21 <h1>信息展示</h1>
22 
23 <table border="1">
24 
25     <tr>
26         <td>姓名</td>
27         <td>性别</td>
28         <td>邮箱</td>
29     </tr>
30     {% for i in info_list %}
31 
32         <tr>
33             <td>{{ i.username }}</td>
34             <td>{{ i.sex }}</td>
35             <td>{{ i.email }}</td>
36         </tr>
37 
38     {% endfor %}
39 
40 </table>
41 
42 </body>
43 </html>
44 
45 
46 ----------------------------------------------models.py
47 from django.db import models
48 
49 # Create your models here.
50 
51 
52 class UserInfor(models.Model):
53 
54     username=models.CharField(max_length=64)
55     sex=models.CharField(max_length=64)
56     email=models.CharField(max_length=64)
57 
58 ----------------------------------------------views.py
59 
60 from django.shortcuts import render
61 
62 from app01 import models
63 # Create your views here.
64 
65 
66 def userInfor(req):
67 
68     if req.method=="POST":
69         u=req.POST.get("username",None)
70         s=req.POST.get("sex",None)
71         e=req.POST.get("email",None)
72 
73 
74        #---------表中插入数据方式一
75             # info={"username":u,"sex":e,"email":e}
76             # models.UserInfor.objects.create(**info)
77 
78        #---------表中插入数据方式二
79         models.UserInfor.objects.create(
80             username=u,
81             sex=s,
82             email=e
83         )
84 
85         info_list=models.UserInfor.objects.all()
86 
87         return render(req,"userInfor.html",{"info_list":info_list})
88 
89     return render(req,"userInfor.html")
提交数据并展示(数据库)

4.基于Pycharm创建Django项目

 实现一个简单示例:

(1)url.py

from django.contrib import admin
from django. conf.urls import url
#导入views模块
from app01 import views
    urlpatterna = [
    url (r'^admin/',admin.site.urls),
    # r'^index/'会正则匹配ur1地址的路径部分
    url (r'^show_time/',views.show_time),#新增地址http://127.0.0.1:8001/index/ 与index函数的映射关系

(2)视图views.py

from django.shortcuts import render
#必须定义一个request形参,requeat相当于我们自定义框架时的environ参数
import datetime
def show_time(request) :
    now=datetime .datetime.now()
    ctime=now. strftime("%Y-%m-%d %X")
    return render (request, "index.html",{"ctime":ctime}) # render会读取templates目录下的index.html文件的内容并且用字典中的ctime的值替换模版中的{{ ctime }}

(3)模板

在templates目录下新建文件show_time.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>当前时间:{{ctime}}</h1>

</body>
</html>

测试:

python manage.py runserver 8001  #在浏览器输入:http://127.0.0.1:8001/show_time/ 会看到当前时间
posted @ 2019-10-22 16:35  流浪代码  阅读(228)  评论(0编辑  收藏  举报