(Day52)第四に、ビュー層、テンプレート層

ビュー層

(A)要求および応答オブジェクト

(1)リクエストオブジェクト

ページが要求されたときに、要求オブジェクトがビュー関数に渡された、Djangoは作成しました

  1. 方法:返却要求モード、大文字の文字列
  2. GET:GETリクエストによって運ばれる戻り値のデータ、オブジェクト辞書ライク
  3. POSTは:POSTリクエストによって運ばれるデータ、辞書のようなオブジェクトを返します。
  4. paht_info:ドメイン名を含まない、URLのユーザーアクセスを返します。
  5. ボディ:リクエストボディ、バイト型、運ばストアデータへのポストを要求
# 以GET举例
request.GET.get(xxx='xxx')  # 默认获取最后一个元素
request.GET.getlist()  # 获取所有元素

(2)レスポンスオブジェクト

ビュー機能は、戻り値を持っている必要があり、データ型は、(両方の継承をレンダリングしたHttpResponseをリダイレクト)はHttpResponseでなければなりません

  1. コンテンツ:応答の内容
  2. 文字セット:応答コードの内容
  3. STATUS_CODE:ステータス応答コード

(B)JsonResponseオブジェクト

(1)分離前端と後端

  1. データ相互作用前後端の応答JSONエンコーディングで生成するように設計のHttpResponseサブクラスオブジェクト

  2. 唯一の適切なバックエンドURLインタフェースを記述する必要がある、フロントエンドアクセスインターフェースは、唯一の大辞典+開発ドキュメントは(、どのようなデータインターフェースリターンをフロントに伝える)ことができ返す必要があります

from django.http import JsonResponse
import json
def index(request):
    user_dic = {'name':'json是个傻逼','password':123}

    l = [1,2,3,3,4,5,65]
    return JsonResponse(l,safe=False)

(2)json_dumps_paramsパラメータ

デフォルト値は、パラメータを設定し、トランスコードASCIIにあるensure_ascii中国人を制御するためにトランスコードしません

# 如何让json不对中文进行转码 方法1
json_str = json.dumps(user_dic,ensure_ascii=False)
return HttpResponse(json_str)

#如何让json不对中文进行转码 方法2
return JsonResponse(user_dic,json_dumps_params={"ensure_ascii":False})

(3)安全なパラメータ

JsonReponseデフォルトシリアライズ辞書、他のタイプ(JSONモジュールをシリアル化することができます)の配列ならば、あなたは安全な虚偽のパラメータを設定する必要があります

l = [1,2,3,3,4,5,65]
return JsonResponse(l,safe=False)

CBVと(C)FBV

  1. FBV:関数ベースのビュー

    # views.py
    from django.shortcuts import render,HttpResponse,redirect
    
    def get(self,request):
    print('mylogin>get')
    return  render(request,'login.html')
    
    # urls.py  
    url(r'^get/', views.get), 
  2. CBV:クラスベースのビュー

    # views.py
    from django.shortcuts import render,HttpResponse,redirect
    from django.views import View
    
    class MyLogin(View):
        def get(self,request):
            print('mylogin>get')
            return  render(request,'login.html')
    
        def post(self,request):
            print('mylogin>post')
            return HttpResponse('post')
    
    # urls.py  
    url(r'^login/', views.MyLogin.as_view()), 

(D)CBVソース

  1. プロジェクトは、それが自動的にas_​​viewメソッドを実行し、開始し、関数呼び出しのビューに戻るには、(FBVは本質的です)

  2. ビュー機能を呼び出すオブジェクトの発送方法を返します。

    @classonlymethod
    def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):  # 闭包函数
            self = cls(**initkwargs)  # cls是我们自己写的类 MyLogin  self是我们自己定义的类的对象
            # 在看源码的时候 你一定要把握住一个顺序 对象在查找属性和方法的时候
            return self.dispatch(request, *args, **kwargs)
        return view
  3. モード要求を得るための反射法を用いてディスパッチ機能は、対応するメソッドを呼び出すこと

    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        # 判断当前请求方式在不在默认的八个方法内
        # 1.先以GET请求为例
        if request.method.lower() in self.http_method_names:
            # 利用反射去我们自己定义类的对象中查找get属性或者是方法  getattr(obj,'get')
            # handler = get方法
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 调用get方法

(E)デコレータ

(1)FBV添加デコレータ

そして、同じ一般的な機能に加えてデコレータ

(2)CBV添加デコレータ

Method_decorator装飾的な機能は、デコレータデコレータを変換するための方法を利用することができます。

  1. プラスダイレクト機能デコレータ
  2. デコレータが直接追加されます(推奨される使用)
  3. メソッド名は、デコレータによって指定されます
  4. カスタム発送方法、すべてを追加する方法
from django.views import View
from django.utils.decorators import method_decorator
from django.utils.safestring import mark_safe
# 3.方法装饰器通过name指定
@method_decorator(outer,name='post')
# 4.1 方法装饰器通过name指定dispatch给所有方法加
# @method_decorator(outer,name='dispatch') 
class MyLogin(View):
    # 4.2 通过自定义dispatch方法,给所有方法加
    def dispatch(self, request, *args, **kwargs):  # 在视图函数执行之前的操作
        return super().dispatch(request,*args,**kwargs)

    # 1. 函数装饰器直接加
    @outer
    def get(self,request):
        print('mylogin>get')
        return  render(request,'login.html')

    # 2. 方法装饰器直接加 (推荐写法)
    @method_decorator(outer)
    def post(self,request):
        print('mylogin>post')
        return HttpResponse('post')

第二に、テンプレート層

(A)は、テンプレートの構文

  1. {} {}および関連する変数
  2. %% {}との論理依存性

値による(B)テンプレート

値(1)(レンダリング)

  1. 値で辞書パス:値によって、以下のために
  2. 地元の人々()によって値によって:すべてのすべての名前は、伝統的な価値観のためのhtmlページに伝え、より現在の名前空間
# 给html传值的方式1,传递的值较多时,不方便
return render(request,'test.html',{'n':n})

# 给html传值的方式2,local()会将当前所在名称空间所有的名字全部传递给html页面
return render(request,'test.html',locals())

(2)基礎となるデータ・タイプ

Pythonの値でサポートされているすべての基本データ型

(3)関数とオブジェクト

  1. htmlページのテンプレートの構文への伝達関数名やクラス名は自動的に括弧を呼び出します場合は、その値を返します。
  2. 関数テンプレートの構文は、関数呼び出しのパラメータを渡す必要はありませんだけで、HTMLやノンパラメトリック関数に渡すことができる関数パラメータの受け渡しを、サポートしていません。

(4)点(。)

  1. Djangoテンプレート言語では.、辞書はプロパティやメソッドの呼び出しを評価するために使用することができ、デジタルインデックスクエリを特別な意味を持っています
  2. クエリシーケンス:辞書検索>プロパティやメソッドクエリ>デジタルインデックスクエリ
# views.py
dic = {'username':'wick','hobby':['read','study',['run','sing',{'age':18}]]}

# html中取值方法
{{dic.hobby.2.2.age}}  # 18

(C)フィルタ|

(1)定義および文法

  1. 提供される方法テンプレートの構文を含む、すぐにデータを処理することができます
  2. 構文:{{ value|filter_name:参数 }}
  3. サポートチェーン
  4. パイプラインの|約スペースなし

(2)一般的なフィルタ

  1. 長さ:戻り値の長さ
  2. filesizeformat:ファイルサイズの自動変換後の復帰
  3. 安全:エスケープHTMLとJS-タグを帰国後(デフォルトでは、自動的にHTMLタグを転送しません)
  4. 追加:加算結果を返し、文字列をサポートするために、
  5. スライス:スライスリターン結果はステップサイズをサポートし、負
  6. デフォルト:デフォルト値がnullを返す、それ以外の場合は、値そのものを返します。
  7. truncatechar:テキスト文字の傍受は、含まれている???
  8. truncatewords:テキストの内容を傍受するには、含まれていません···、スペースがに従って決定されます
<p>统计长度:{{ s|length }} (无法统计,默认返回0)</p>
<p>文件大小自动转换:{{ file_size|filesizeformat }}</p>
<p>展示带有标签的文本:{{ sss }}(默认不会自动转换成html标签,防止恶意攻击)</p>
<p>展示带有标签的文本:{{ sss|safe }}(safe设置自动转换成html标签)</p>
<p>加法运算:{{ n|add:234567 }} (内部异常捕获,支持数字相加,字符串相加,都不符合,返回'')</p>
<p>切片操作:{{ l|slice:'0:2'}} (支持步长、负数)</p>
<p>判断是否有值:{{ is_value|default:'is_value变量名指向的值为空' }}</p>
<p>截取文本内容(字符):{{ s|truncatechars:4}} (截取4个字符,包含···)</p>
<p>截取文本内容:{{ s2 | truncatewords:5}} (按照空格截取5个单词,不包含···)</p>

(3)前端と後端アンエスケープ

  1. フロントエンド:安全

  2. バックエンド:mark_safe

    from django.utils.safestring import mark_safe
    res = mark_safe(cc)

(IV)ラベル

論理的に関連

(1)forループ

  • 分類
    1. ループのための通常の
    2. 以下のために...空:ループのためのオブジェクトが空である場合には、文が実行されます
  • パラメータをカムズforloop
    1. forloop.counter0:循環電流インデックス値(ゼロ)
    2. forloop.counter:(1から始まる)現在のサイクルカウント
    3. forloop.revcounter0:現在のサイクル(0から始まる)の逆インデックス値
    4. forloop.revcounter:逆電流サイクルカウント値(1から始まります)
    5. forloop.first:現在のサイクルは、最初のサイクル(論理値)でない決定
    6. forloop.last:決定現在のサイクルが最後のサイクル(ブール値)ではありません
    7. forloop.parentloop:この層は、外側のループサイクルであります

(2)もし分析

ステートメントサポートしている場合や、または、==、>、<,! =、<=、> =、いないで、で、である、と判断されていません

{% for foo in l %}
    {% if forloop.first %}
        <p>这是第一个数</p>
    {% elif forloop.last %}
        <p>这是最后一个数</p>
    {% else %}
        <p>中间的数{{ foo }}</p>
    {% endif %}
    {% empty %}
        <p>当for循环的对象为空时,执行该语句</p>
{% endfor %}

(3)と

  1. 等号とスペースなし約複素変数のエイリアスに使用される中間変数の定義。
  2. エイリアスはのみとの内部で使用することができます
<!--dic = {'username':'wick','hobby':['read','study',['run','sing',{'age':18}]]}-->
{% with  dic.hobby.2.2.age as age   %}
    <p>{{ age }}</p>
{% endwith %}

(4)csef_token

  1. このタグは、使用CSRFの保護です。

  2. ページの形で形で書き込むた{%csrf_token%}

(E)カスタム

カスタマイズは、3つのことを行う必要があります。

  1. アプリケーションフォルダに新しいtemplatetagsを作成します。
  2. 任意のファイルの名前の中に新しいフォルダを作成しますPY
  3. あなたはPYファイルに次の2つの文を記述する必要があります:
    1. django.templateインポートライブラリから
    2. レジスタ=ライブラリ()

あなたは、フィルタ、ラベルやinclusion_tagをカスタマイズすることができ、ページ上でそれをロードするために使用されなければなりません

  • inclusion_tag:外部の着信パラメータを受け入れることができます機能があり、その後、htmlページに渡され、データが返された後、ページのレンダリング用のページが完了しました
# mytag.py
# 自定义过滤器(和默认的过滤器一样,最大只能接受两个参数)
@register.filter(name='baby')
def index(a,b):
    return a+b

# 自定义标签,可以接受任意多个参数
@register.simple_tag(name='mytag')
def mytag(a,b,c,d):
    return f'{a}?{b}?{c}?{d}'

# 自定义inclusion_tag
@register.inclusion_tag('mytag.html',name='xxx')
def index6(n):
    l = []
    for i in range(n):
        l.append(f'第{i}项')
    return locals()  # 将l直接传递给mytag.html页面
<p>自定义过滤器的使用</p>
{% load mytag %}
{{ 1|baby:1 }}

{#<p>自定义标签的使用,可以接受多个参数,参数必须用空格隔开</p>#}
{#{% load mytag %}#}
{#{% mytag 'a' 'b' 'c' 'd' %}#}

{#<p>自定义的过滤器可以在逻辑语句中使用,而自定义标签不可以</p>#}
{#{% if 1|baby:2 %}#}
{#    <p>有值</p>#}
{#{% else %}#}
{#    <p>无值</p>#}
{##}
{#{% endif %}#}

<p>自定义inclusion_tag的使用,当需要使用一些页面组件,且该组件需要参数才能正常渲染时使用</p>
{% load mytag %}
{% xxx 11 %}
</body>
</html>

継承とインポート(6)テンプレート

(1)は、継承されたテンプレートを拡張します

サブページでは継承マザーボードにページの上部に次の構文を使用して

{% extends 'home.html' %}

(2)ブロック(ブロック)

連続名前で地域で見つかった対応する名前を見つけ、修正することができた後、親ページの描写に関する地域ブロックの使用は、変更したいです

  1. テンプレートの詳細ブロック領域は、ページの強力な拡張は、あなたがテンプレートページ、少なくとも三つの領域(CSSエリア、htmlコード領域と、JSの面積)を持っていることをお勧めします
  2. これら三つの領域を通じて、我々は、各ページには独自の個別のCSSやJSのコードを持って実装することができます
  3. サブページに{{block.super}}継承親ページによって概要

(3)導入(含みます)

直接モジュールの使用などのHTMLページに:{% include 'form.html'%}

{% block content %}
    <p>我改成home1页面内容</p>
    {{block.super}}
    {% include 'form.html' %}
{% endblock %}

{% block css %}
    <style>
        p {
            color: green;
        }
    </style>
{% endblock %}

{% block js %}
    <script>
        alert('login')
    </script>
{% endblock %}

おすすめ

転載: www.cnblogs.com/wick2019/p/11938333.html