django基础补充(一)

一, MVC模式和MTV模式

1,MVC模式:把web应用分为模型(Model),控制器(Controller),视图(View)三层;他们之间以一种插件似的,松耦合的方式连接在一起。
django基础补充(一)_第1张图片
2,MTV模式:

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

Template(模板);负责业务逻辑,在适当的时候调用model和Template

在Django中MTV和MVC是有些一致的,除了Django有一个url分发器
django基础补充(一)_第2张图片

二,模板中的一些基本变量

1,基本变量

urls.py文件

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/', views.test),

]

views.py文件

from django.shortcuts import render

def test(request):
    num = 1
    string = 'shabi'
    list1 = ['laowang', 'erha', '哈哥']
    dic = {
     'name': 'hpl', 'age': 18, 'sex': 'M'}
    tup = ('pig', 'dog', 'cat', 'panda')
    set1 = {
     'haha', 'xixi', 'jiji'}

    return render(request, 'test.html',
                  {
     
                      'num': num,
                      'string': string,
                      'list1': list1,
                      'dic': dic,
                      'tup': tup,
                      'set1': set1,
                  })

templates下新建test.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{
    { num }}
<br>
{
    { string }}
<br>
{
    { list1.0 }}
<br>
{
    { dic.items }}, {
    { dic.keys }}, {
    { dic.values }}, {
    { dic.name }}
<br>
{
    { tup }}, {
    { tup.1 }}
<br>
{
    { set1 }}

body>
html>

运行结果
django基础补充(一)_第3张图片
2,过滤器

views.py文件

from django.shortcuts import render
import datetime

def test(request):
    num = 1
    string = 'shabi'
    list1 = ['laowang', 'erha', '哈哥']
    dic = {
     'name': 'hpl', 'age': 18, 'sex': 'M'}
    tup = ('pig', 'dog', 'cat', 'panda')
    set1 = {
     'haha', 'xixi', 'jiji'}
    now = datetime.datetime.now()

    return render(request, 'test.html',
                  {
     
                      'num': num,
                      'now': now,
                      'haha': 'dog',
                      'string': string,
                      'list1': list1,
                      'dic': dic,
                      'tup': tup,
                      'kong': '',
                      'set1': set1,
                      'aa': '百度一下',
                      'hpl': 'hpl',
                      'hpl_age': 18,
                      'filesize': 1024 * 1024 * 1024 * 1024 * 1024,
                      'long_str': '人群中哭著 你只想变成透明的颜色 你再也不会梦或痛或心动了 你已经决定了 你已经决定了 '
                                  '你静静忍著 紧紧把昨天在拳心握著 而回忆越是甜就是越伤人了 越是在手心留下密密麻麻深深浅浅的刀割 '
                                  '你不是真正的快乐 你的笑只是你穿的保护色'

                  })

test.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{# default过滤器,即haha没有值,则将pig传给haha, 假如有值,就不使用pig #}
{
    { haha|default:'pig' }} {# :前后不能加空格,否则会报错 #}
{# 空值也会被default替换 #}
{
    { kong|default:'暂时没有数据!' }}
<br>

{# filesizeformat可视化文件大小 #}
{
    { filesize|filesizeformat }}

<br>
{# add加法 #}
{
    { 4|add:5 }}
{# add减法 #}
{
    { 9|add:-3 }}
{# 字符串为拼接 #}
{
    { 'hpl'|add:' is a shuaige' }}
{
    { list1|add:list1 }}
<br>
{# upper转大写;lower转小写;title首字母大写 #}
{
    { hpl|upper|lower|title }}
<br>
{# length表示长度 #}
{
    { list1|add:list1|length }}
<br>
{# slice表示切片,python中为[::] #}
{
    { list1|slice:'::2' }}, {
    { list1|slice:'::' }}
<br>
{
    { list1.0|first }}, {
    { list1|first }}, {
    { list1.0|last }}, {
    { list1|last }}
<br>
{# join表示用指定的字符连成一个新的字符串 #}
{
    { list1|join:'_' }}
<br>
{# truncatechars表示按字符截断 , truncatewords表示按单词(英文)进行截断#}
{
    { long_str|truncatechars:'10' }}, {
    { long_str|truncatewords:'5' }}
{# date添加时间 #}
{#{
    { now|date:'Y-m-d H:i:s' }}#}
{#也可以去setting中配置#}
{#添加:DATETIME_FORMAT = 'Y-m-d H:i:s'#}
{#修改:USE_L10N = False#}
{
    { now }}
<br>
{# 这里相当于我们写了一个a的超链接标签 #}
{
    { aa|safe }}

body>
html>

django基础补充(一)_第4张图片
结果为
django基础补充(一)_第5张图片
3,自定义过滤器

1,在app01下创建名为templatetags的python包 (包名字不能错)
2,创建一个python文件(mytags.py)
3,在mytags.py中写
from django import template

register = template.Library() (变量名不能错)
4,写函数并加上装饰器
@register.filter
def splicing(a, b): # 参数最多两个
# 功能
return ‘%s-%s’ % (a, b)

mytags.py文件

from django import template

register = template.Library()

@register.filter
def splicing(a, b):  # 参数最多两个
    # 功能
    return '%s-%s' % (a, b)

test.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{# 模板中的导包 load+文件名 #}
{% load mytags %}
{
    { hpl|splicing:'dashuaige' }}

body>
html>

结果
django基础补充(一)_第6张图片
可能会报的错
django基础补充(一)_第7张图片

4,常用的forloop.

test.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{# counter表示序号从1开始,counter0表示序号从0开始 #}
{# revcounter表示倒序到1,revcounter0表示倒序到0  #}
{# first表示第一次循环为True,其他的都是False #}
{# last表示最后一次循环为True, 其他都是False #}

<ul>
    {% for lis in list1 %}
        <li>{
    { forloop.counter }} : {
    { lis }}li>
    {% endfor %}
ul>
<ul>
    {% for lis in list1 %}
        <li>{
    { forloop.counter0 }} : {
    { lis }}li>
    {% endfor %}
ul>
<ul>
    {% for lis in list1 %}
        <li>{
    { forloop.revcounter }} : {
    { lis }}li>
    {% endfor %}
ul>
<ul>
    {% for lis in list1 %}
        <li>{
    { forloop.revcounter0 }} : {
    { lis }}li>
    {% endfor %}
ul>
<ul>
    {% for lis in list1 %}
        <li>{
    { forloop.first }} : {
    { lis }}li>
    {% endfor %}
ul>
<ul>
    {% for lis in list1 %}
        <li>{
    { forloop.last }} : {
    { lis }}li>
    {% endfor %}
ul>
body>
html>

结果
django基础补充(一)_第8张图片
5,empty

test.py文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{# {% empty %}末尾显示提示信息 #}
{% for k in kong %}
    {
    { k }}
{% empty %}
    其实啥都没有!!!
{% endfor %}

body>
html>

结果
django基础补充(一)_第9张图片
6,if

test.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{% if hpl_age < 20 %}
    hpl还是小伙子!
{% elif hpl.age >= 20 and hpl_age < 30 %}
    hpl已经老大不小了!!
{% else %}
    hpl已经步入中老年!!!
{% endif %}

{# 模板语言不支持的有 #}
{# 1,不支持算术运算 #}
{# 2,不能进行连续的判断,如:9>6>2 #}

{#{% if hpl.age == 10 + 8 %}#}
{#    hpl要步入成年了!#}
{#{% endif %}#}
<br>
{% if hpl_age == 10|add:8 %}
    hpl要步入成年了!
{% endif %}

body>
html>

结果为
django基础补充(一)_第10张图片
注:python中的连续比较和js中有差别

python中
django基础补充(一)_第11张图片
js中
django基础补充(一)_第12张图片
python中是先7>5为True,然后5>2为True,最后用两个True作与,即True and True为True,所以结果为True

js中是先7>5为true,再进行true>2的比较,因为true为1,即1>2为false,所以结果为false

7,with

test.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

{% with list1.0 as l %}
    {
    { l }}
    {
    { l }}
    {
    { l }}
{% endwith %}

<br>

{% with l=list1.2 %}  {# 等号两边不能加空格,否则汇报错 #}
    {
    { l }}
    {
    { l }}
    {
    { l }}
{% endwith %}

body>
html>

django基础补充(一)_第13张图片
8,csrf_token

csrf_token 是为了防止csrf(跨站请求伪造),更通俗的讲:就是防止黑客盗用你存在网站(cookie)上的账户密码和信息

在templates下新建form.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <input type="text">
    <button>提交</button>
</form>
</body>
</html>

运行后点击提交按钮会报错
django基础补充(一)_第14张图片
这是django的一种安全机制,加上csrf_token就可以去掉大黄页

form.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text">
    <button>提交button>
form>
body>
html>

这次再提交就没问题了

你可能感兴趣的:(基础,python,django)