MVC是模型(model)—视图(view)—控制器(controller) 模式三个单词首字母的缩写。而django对应有这几个需要编辑的基本文件:settings.py,urls.py,views.py,models.py,apps.py四个文件。自然的有如下对应:V——views.py,M——models.py,C——settings和urls和app.py。接着逐一讲述我的理解:
V(views.py文件):“视图管理的不是你所看到的”
有好些萌新以为view文件管理的就是显示在页面上的东西,而恰恰相反它管理的是像类似http这样看不见的网络协议。它关注的是tcp,udp交换与流动——却也不完全是。这么说也许很绕口,但是细讲来有很容易理解:django的views.py是关注这些后台的网络协议但是它仅仅只用一个render()函数就完成了复杂的HTTP通信——这是其他架构无法比拟的,python对新手如此之友好的特点,在django里也表现得淋漓尽致。
以下示例表现了一个HTTP的交互过程(请求和应答):
from django.shortcuts import render def test(request): return render(request, 'test.html', {'document_root': '/student/static'})
第一行导入了render()所需要的模块。第二行定义了test函数,test名字可以随便取主要是用于urls.py映射时传入name参数进行映射。第一行括号里的request参数用于传入http请求。
第二行return是返回fttp应答。request是第一行传入的形参。第二个参数是要显示的html页面,这个是由前端来完成的,它放在templates文件夹里。最后一个document_root是传入css,js,图片,视频等html的附属配置文件的路径,一般都分门别类的放在static文件夹里。。
这里给出我的views.py文件的代码:
from django.http import HttpResponseRedirect
from .forms import StudentForm
from .models import Student
from django.urls import reverse
def index(request):
students = Student.get_all()
if request.method == 'POST':
form = StudentForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('index'))
else:
form = StudentForm()
from django.shortcuts import render
context = {
'students': students,
'form': form,
}
return render(request, 'index.html', context=context)
def test(request):
return render(request, 'test.html', {'document_root': '/student/static'})
M(models.py文件):这才是你在页面所可以看到的东西
这些模型才是你可以看的,他可以用python来定义表单,文本等等。它们都是一个个类成员:例如一个student类,你可以定义性别,年龄,学号这些类成员等等显示在一个页面上。当然可以定义多个类加以分类区别。这样代码变多时更易于管理。例子如下:
from django.db import models class Student(models.Model): SEX_ITEMS = [ (1, 'male'), (2, 'female'), (0, 'unknown'), ] name = models.CharField(max_length=128, verbose_name='姓名') sex = models.IntegerField(choices=SEX_ITEMS, verbose_name='性别') profession = models.CharField(max_length=128, verbose_name='职业') email = models.EmailField(verbose_name='电子邮箱') qq = models.CharField(max_length=128, verbose_name='QQ') phone = models.CharField(max_length=128, verbose_name='手机号码')
注意:SEX_ITEMS是用来定义性别sex的下拉选项的。name的max_length定义表示名字的字符串最长长度是128。在页面上输入框前显示verbose_name里的“姓名”两字,其他的依次类推。
models.py文件自以为还是比较易懂的,至少是相对于views.py文件来说吧。
下面是我的代码示例:
from django.db import models
class Student(models.Model):
SEX_ITEMS = [
(1, 'male'),
(2, 'female'),
(0, 'unknown'),
]
STATUS_ITEMS = [
(0, 'applying'),
(1, 'passed'),
(2, 'refused'),
]
name = models.CharField(max_length=128, verbose_name='姓名')
sex = models.IntegerField(choices=SEX_ITEMS, verbose_name='性别')
profession = models.CharField(max_length=128, verbose_name='职业')
email = models.EmailField(verbose_name='电子邮箱')
qq = models.CharField(max_length=128, verbose_name='QQ')
phone = models.CharField(max_length=128, verbose_name='手机号码')
status = models.IntegerField(choices=STATUS_ITEMS, default=0, verbose_name="状态")
created_time = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="创建时间")
def __str__(self):
return ''.format(self.name)
class Meta:
verbose_name = verbose_name_plural = "StudentInf"
@classmethod
def get_all(cls):
return cls.objects.all()
C——controllor(控制层):“文件较多,比较复杂”
这一层包含了app.py,urls.py,settings.py——至少是自己这么认为的。先讲app.py,每当你在models.py里添加一个类,你要启用它就必须在app.py的列表里添加它。没啥好讲的,看了就懂,代码如下所示:
from django.apps import AppConfig class StudentConfig(AppConfig): name = 'student'
接着讲settings.py它可以定义静态路径,这个是与css,js文件存放目录有关的。其他的,还可以修改后台的时间(太平洋时间,美国时间,中国时间,等等)和显示语言(汉语,英语等等)。示例如下:
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True STATIC_URL = '/static/' STATIC_ROOT = 'C:/Users/32964/student_house/student_sys/student/static'
接着urls.py它决定你在浏览器输入什么地址之后显示什么页面,说白了就是将URL地址与html页面建立对应关系(映射),与URL相关时自然会用到RE正则表达式。示例如下:
from django.contrib import admin from django.conf.urls import url from student.views import index from student.views import test from django.views.static import serve from . import settings urlpatterns = [ url(r'test/', test, name='test'), url(r'^$', index, name='index'), url(r'^admin/', admin.site.urls), url(r'^staticfiles/(?P
.*)$', serve, {'document_root': settings.STATIC_ROOT, 'show_indexes': True}), ] 注意:from . import settings一句,别忘了要导入相应的名称空间。
在urls.py文件里:
from django.contrib import admin
from django.conf.urls import url
from django.views.static import serve
urlpatterns = [
url(r'^staticfiles/(?P.*)$', serve, {'document_root':settings.STATIC_ROOT, 'show_indexes': True}),
]
在settings.py文件里(STATIC_ROOT里写存放css等文件的static文件夹路径):
STATIC_URL = '/static/'
STATIC_ROOT = 'C:/Users/32964/student_house/student_sys/student/static'
在views.py文件里:
def test(request):
return render(request, 'test.html', {'document_root': '/student/static'})
主要是render()函数别忘了加document_root静态路径。
END