Django-MTV模型(一)

一、MTV模型介绍

Django的MTV分别代表:

  Model(模型):负责业务对象和数据库的对象(ORM)

  Template(模板):负责如何把页面展示给用户

  View(视图):负责业务逻辑,并在适当的时候调用Model和Template

Django除了MTV外,还有URL分发器,用于将每个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

 

 

二、Django基本命令

1.下载Django

pip3 install Django==1.11.11

2.创建一个Django项目

django-admin.py startproject mysite

当前目录下会生产几个文件:

manage.py  Django项目里的工具,通过它可以调用django shell和数据库。

settings.py  包含项目默认配置,包括数据库信息,调试标识以及其他一些工作变量。

urls.py    负责把URL模式映射到应用程序。

3.在mysite目录下创建应用

python manage.py startapp app01

4.启动django项目

python manage.py runserver 8080

5.同步数据库表或字段

当在models.py中新增类后,通过执行以下命令即可在数据库中创建表。

python manage.py makemigrations
python manage.py migrate

6.清空数据库

执行以下命令会将数据库中内容都清空,只留下空表。

python manage.py flush

7.创建 超级管理员

python manage.py createsuperuser
修改密码时执行
python manage.py changepassword username

8.Django项目环境终端

python manage.py shell

可以在此终端中调用当前项目model.py中的API,对操作数据测试较方便。

9.Django项目环境终端

python manage.py dbshell 

进入在settings.py中配置的数据库,可执行SQL语句。

10.查看更多命令

python manage.py

用于查询命令

11.静态文件配置

 static配置:

  主要包括css、JavaScript、图片这样的文件。

STATIC_URL='/static/'
STATICFILES_DIRS=[
     os.path.join(BASE_DIR,"static")        #需添加实际文件夹名称
]

media配置:

media指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件
#settings.py中
MEDIA_URL="/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload")

#url.py中
from django.views.static import serve
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

三、视图层之路由配置系统(views)

URL配置就像Django所支撑网站的目录。本质是URL与要为该URL调用的视图函数 之间的映射表。

urlpatterns=[
    url(正则表达式,views视图函数,参数,别名),
]

#参数为可选的要传递给视图函数的默认参数(字典形式)

1.URLconf的正则字符串参数

简单配置

from django.conf.urls import  url
from . import views

urlpatterns = [
    url(r'^articles/2003/$',views.special_case_2013),
    url(r'^articles/([0-9]{4})/$',views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$',views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$',views.article_detail),   
]
#一旦匹配成功则不再继续
#若要从url中捕获一个值,需要在周围放置一堆圆括号
#不需要添加一个前导的反斜杠,因为每个URL都有,例如应该是^articles而不是^/articles
#每个正则表达式前面的'r'是可选的,但是建议加上
#/articles/2005/3/不匹配任何URL模式,第三个模式月份为两位数。
#/articles/2003/匹配第一个模式,匹配成功,不会在匹配第二个模式,虽然第二个也可以匹配成功。
#/articles/2005/03/ 匹配第三个模式,Django将调用函数views.month_archive(request,'2005','03').

#设置向是否开启 URL访问地址后面不为/跳转至带有/的路径
#APPEND_SLASH=True

有名分组(named group)

使用命名的正则表达式组来捕获URL的值并以关键字参数传递给视图。

Python正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/2003/$',views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$',views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$',views.article_detail),   
]
#通过分组命名,可以将捕获值作为关键字参数而不是位置参数传递给视图函数。
#/articles/2005/03/
#请求将调用views.month_archive(request,year='2005',month='03')函数

导入其他URLconfs文件内容

from django.conf.urls import include,url

urlpatterns = [
    url(r'^admin/',admin.site.urls)
    url(r'^blog/',include('blog.urls')),_
]
#blog为app,访问app下所有url时,前缀需为app名。

2.URL的反向解析

根据Django视图的标识和将要传递给它的参数的值,获取与之关联的URL。可以避免将URL硬编码在HTML页面中,提示可扩展性。

在需要使用URL的地方,对于不同层级,Django提供不同的工具用于URL反查:

  • 在模板中:使用URL模板标签。
  • 在Python代码中:使用django.core.urlresolvers.reverse()函数。
  • 在更高层与处理Django模型实例相关的代码中,使用get_absolute_url()方法
#在URLconf中:
from django.conf.urls import url
from . import views

urlpatterns = [
     url(r'^articles/([0-9]{4})/$',views.year_archive,name='news-year-archive'),
]
#name后为昵称,模板中使用昵称代替URL。
#在模板中:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<ul>
{%for yearvar in year_list %}
<li><a href="{%url 'news-year-archive' yearvar%}">{{yearvar}}
 Archive</a></li>
{%end for%}
<ul>

#在python代码中
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    year = 2006
    return HttpResponseRedirect(revers('news-year-archive',args=(year,)))

3.名称空间

为避免在不同app的urls中定义相同的name时,可能导致UR反解错误,引入名称空间。

project.urls:

#project.urls
urlpatterns=[
    url(r'^admin/',admin.site.urls),
    url(r'^app01/',include("app01.urls",namespace="app01"))
    url(r'^app02/',include("app02.urls",namespace="app02"))
]
#app01.urls:
urlpatterns=[
    url(r'^index/',index,name='index'),
]
#app02.urls:
urlpatterns=[
    url(r'^index/',index,name="index"),
]
#app01.views
from django.core.urlresolvers import reverse
def index(request):
    return HttpResponse(reverse("app01:index"))  #加上名称空间就不会冲突了

四、视图层之视图函数(views)

视图函数简称视图,是一个简单的python函数,接收Web请求并返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML或者一张图片等。约定将视图放置在项目或者应用程序目录中的名为view.py的文件中。

1.一个简单的视图

下面是返回当前日期和时间作为HTML文档的视图

from django.http inport HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>"% now
    return HttpResponse(html)

2.render函数

render(request,template_name[,context])

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象。

参数:

  request:用于生成响应的请求对象。

  template_name:要使用的模板的完整名称,可选的参数。

  context:添加的模板上下文的一个字典。木人是一个空字典。如果字典总的某个值是可调用的,视图将在渲染模板之前调用它。

  content_type:生成的文档要使用的MIME类型。默认是DEFALUT_CONTENT_TYPE设置的值。

  status:响应的状态码。默认是200。

2.redirect函数

参数:

  一个模型:将调用模型的get_absolute_url()函数

  一个视图:可以带有参数,将使用urlresolvers.reverse来 反向解析名称

  一个绝对或相对的URL,将原封不动的作为重定向的位置。

默认返回一个临时的重定向,传递permanent=True可以返回一个永久的重定向。

 

五、模板层(template)

将页面的设计和Python的代码分离会更干净简洁更容易维护,使用Django的模板系统可以实现这种模式。

import datetime
now  = datetime.datetime.now()
return render(request,'currnte_datetime.html',{'current_date':str(now)[:19]})

1.模板语法之变量

在Django模板中遍历复杂数据结果的关键是句点字符,语法是{{var_name}}

views:

def index(request):
    import datetime
    s = "hello"
    l = [111,222,333]
    dic = {"name":"xxx","age":11}
    date = datetime.date(1993,5,2)
   
    class Person():
        def __init__(self,name):
            self.name= name
    p1 = Person("xxx")
    p2 = Person("aaa")
    
    person_list = [p1,p2]
    return  render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})

template:

<h4>{{s}}</h4>
<h4>列表:{{l.0}}</h4>
<h4>列表{{l.2}}</h4>
<h4>字典{{dic.name}}</h4>
<h4>日期{{date.year}}</h4>
<h4>类对象列表{{person_list.0.name}}</h4>

2.模板语法之过滤器

 default

如果一个变量是false  或者为空,使用给定的默认值。否则,使用变量的值。

{{value|default:"nothing"}}

length

返回值的长度。它对字符串和列表都起作用。

{{value|length}}

若value是 ['a','b','c'],那么输出为3

filesizeformat

将值格式化为一个文件尺寸

{{value|filesizeformat}}

如果value是123456789,输出的是117.7MB

date

如果value=datetime.datetime.now()

{{value|date:"Y-m-d"}}

slice

如果value=“hello world”

{{value|slice:"2:-1"}}

truncatechars

如果字符串字符多余制定的字符数量,会被截断,截断的字符串将以可翻译的省略号序列("…")结尾。

{{value|truncatechars:9}}

如果value是“hello world” ,输出是“hello ...” ,也就是截断的字符加上三个点总共是9个字符。

safe

Django模板中处于安全考虑,会对HTML标签和JS等语法标签字段转义。如果不希望自动进行转义,可以适用safe过滤器。

value = "<a href=" ">点击</a>"

{{value|safe}}

3.模板语法之过标签

 标签比变量更加复杂:一些在输出中创建为文本,一些通过循环或逻辑来控制流程,一些加载后的变量将使用到的额外信息到模板中。

一些标签需要开始和解释标签(例如{%tag%}...标签内容...{%endtag%})

for标签

遍历每一个元素:

{% for person in person_list %}
         <p>{{person.name}}</p>
{% endfor %}

可以利用{% for obj in list reversed %} 反向完成循环

遍历一个字典:

{% for key,val in dic.items %}
 <p>{{ key }}:{{val}}</p>
{% endfor%}

循环序号可以通过{{forloop}}显示

forloop.counter   从1开始的序号

forloop.counter0  从0开始的序号

forloop.revcounter  反向序号到1

forloop.revcounter0 反向序号到0

forloop.first   如果是第一次循环,则为True

forloop.last   如果为最后一次循环,则为True

for ... emptey

for标签带有一个可选的{{%empty%}} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

{% for person in person_list%} 

  <p>{{person.name}}</p>

{%empty%}

  <p>sorry,no person here</p>

{% endfor%}

if标签

{% if %} 会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出

{% if num>100 or num<0 %}
    <p>无效</p>
{%elif num>80 and num<100 %}
    <p>优秀</p>
{%else %}
    <p>还行</p>
{% endif %}

csrf_token

用于跨站请求伪造保护

4.模板继承(extend)

模板继承可以创建一个基本的“骨架”模板,包含站点中的全部元素,可以定义能够被字幕版覆盖的blocks。

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css"/>
    <title>{% block title %}My amazing site{%/span>endblock %}</title>
   
<body>
    <div id="sidebar">
         {% block sidebar %}
         <ul>
               <li><a href="/">Home</a></li>
               <li><a href="/blog/">Blog</a></li>
         </ul>
          {% endblock%}
    </div>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</head>
</html>

此模板为base.html,定义了一个可以用于两排页面的简单html骨架,子模板的工作是用他们的内容填充空的block。

子模板:

{% extends “base.html” %}

{% block title %}My amazing blog {% endblock %}

{%block content %}
{% for entry in blog_entries %}
    <h2>{{entry.title}}</h2>
    <p>{{entry.body}}</p>
{% end for %}
{%endblock%}

extents标签是关键,告诉模板引擎,这个模板继承了另一个模板。当疤系统处理这个模板时,首先定位父模板,也就是base.html。

 

转载于:https://www.cnblogs.com/n1ghtwatcher/p/8849780.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值