Djano实战(3) 论DjangoMVC模式(包括css/img/js的static路径设置,以学生管理系统为例)

  • 一、MVC的认识

     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——view(视图)的理解

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——model(模型)的理解

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的理解

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

你可能感兴趣的:(Python的学习,Django框架的学习)