Djangoのフレームワーク4

Djangoのフレームワーク4


単純な実装.render

from django.shortcuts import render,HttpResponse
from django.template import Template, Context

def db_render(request):
    temp = Template("<h1>{{user_dic}}{{user_dic.username}}{{user_dic.password}}</h1>")
    user_dict = Context(
        {
            'user_dic': {
                'username': 'jason',
                'password': 1123,
            }
        }
    )
    res = temp.render(user_dict)

    return HttpResponse(res)

結果は:

二.CBVとFBV

ビュー機能は必ずしも関数ではありません、それはクラスすることができ

FBV:ビュー関数に基づいて、

CBV:クラスベースのビュー

基本的な文言をCBV:

from django.views import View


class MyLogin(View):

    def get(self, request):
        return render(request, 'login_cbv.html')

    def post(self, request):
        return HttpResponse('我是类里面的post方法')

フロントエンドコード

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
      <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
    <h2 class="text_center">这里是login_cbv页面</h2>
    <form action="" method="post">
        <p>
            提交 <input type="submit" class="btn btn-primary">
        </p>
    </form>
</body>
</html>

login_cbvに向けてGETリクエストを提出する際にMyLoginは、getメソッドの内部で自動的に実行しました

POSTリクエストは自動的にPOSTメソッドによるMyLogin内で行わ提出しました

なぜMyLoginは、自動的にソースCBVを導入するための方法とは異なる対応するリクエストメソッドを実行します

三.CBVソース

画期的な研究ソース:
URL(R&LT '^ login_cbv'、view.MyLogin.as_view())

推測

as_viewいずれかのクラス定義@staticmethod内部の正常な機能

@classmethodのクラスに結合することによって定義されたクラスのメソッドのいずれか

結合方法のクラスで見つかったソースコードを参照してください。

注詳細な手順を示しています。

プロセスの詳細:

ルート一致にFBVとCBV本質的に同じ

# 首先MyLogin是我们自己创建的类,里面写了get与post方法
# 然后这个类继承了View类,所以调用了View里面的as_view方法
# as_view方法返回的是View类里的闭包函数view的地址值
# 所以url(r'^login/',views.MyLogin.as_view())就相当于:url(r'^login/',views.view)
# 正则匹配到login后,调用view函数,首先生成了一个我们自己创建的类的对象,self,接着给self对象添加属性,再通过对象.属性调用方法dispatch方法,对象以及产生对象的类中没有这个方法,所有调用了父类中的dispatch方法
# 在displatch中首先判断请求的请求方式是否在默认的八大请求方式中,再在对象中找到对应的请求方法post或get,display返回的是请求方式()就是执行了请求方法
所以:
    朝着login_cbv提交get请求时会自动执行MyLogin里面的get方法

而提交post请求也会自动执行MyLogin里面的post方法

IV。自分自身のプロジェクトへのソースアプリケーションに基づいて、Djangoの設定を

Djangoはなく、デフォルトの設定の内側、設定をカスタマイズすることができますユーザーに公開しました

ユーザーの使用上のユーザープロファイルは、ユーザーがデフォルトを使用するように設定されていません

値テンプレートの構文によってV.

テンプレートの構文記法

{} {}関連変数

%}%{論理的に関連

伝統的な価値観のテンプレートテンプレート層

{#テンプレートこの注釈フロントエンドのブラウザチェックのコメント構文は、目に見えない#です}

pythonのすべての基本データ型は、htmlファイルのサポートに渡されます

関数やクラス:

関数やクラスを自動的に実行括弧追加されます

得られた関数は、クラス関数の戻り値であり、その目的は、得られます

テンプレートの構文は、パラメータの受け渡しをサポートしていません。

2つの方法でバックエンドデータへのHTMLファイルの転送:

1.指名道姓

リターンレンダリング(要求、 'index.htmlを' { 'N':N、 'M'、M})

2.locals()すべてのhtmlページに渡されたすべての変数名の現在の名前空間を設定し、

()(地元の人々、 'index.htmlを'、要求)をレンダリング返します

バックエンドのデータ伝送にオーバー取得する方法についてHTMLページ

{{}}変数名

値:

ジャンゴテンプレートの構文値は、動作期間文字の唯一の一の形態であります

ポイントインデックス

重要なポイント

例:

            <p>{{ l.2 }}</p>
            <p>{{ d.username }}</p>
            <p>{{ d.password }}</p>
            <p>{{ d.hobby.1.username.1 }}</p>

VI。フィルター

| ...標準化するためのフォーマットではなく、カオススペース

フィルタ|フィルタは、右の名前であるとき、最初の引数はフィルターとして残されますがときに、第2のパラメータフィルター行われます

求数据长度:
<p>
    {{ s|length }}
</p>

加法运算:
<p>
    {{ n|add:12 }}, 两个整型是相加求和
    {{ s|add:'da'}} 两个字符串是拼接 如果一个是字符串一个是整型会报错
</p>

默认值(判断值是否为空):   如果前面的值是空,则返回:后面的,如果前面的值不为空,则返回:前面的
<p>
    {{ b|default:'这个b布尔值是true'}},
    {{ ff|default:'这个ff布尔值是false'}}
</p>

截取字符(截取5个字符 三个点也算):
<p>
   {{ s|truncatechars:8 }}, 
</p>
截取单词 (截取4个单词 三个点不算): 以空格为一个单词结束
<p>
    {{ ss|truncatewords:4 }}
</p>
文件大小:
<p>
    {{ file_size|filesizeformat }}
</p>

切片操作:
<p>
    {{ s|slice:'0:2' }},
    {{ s|slice:'0:8:2'}}
</p>
日格式化:
<p>
    {{ ddd|date:'Y年/m月/d日' }}
</p>

转义:直接传前端语法,为防止恶意脚本,传过去并不执行,
除非后端用mark_safe()来包装一下
或者前端用|safe来表示安全
<p>
    {{ res|safe }}, {{res1}},{{res2}}
</p>
ps:前端代码不一定非要在前端页面写,可以在后端写好传递给前端页面使用,这样就可以利用到后端更加多的逻辑语法

VII。ラベル

論理的に関連

{% for foo in l %}
    {% if forloop.first %}
        <p>第一次</p>
    {% elif forloop.last %}
        <p>最后一次</p>
    {% else %}
        <p>
            {{foo}}
</p>
    {% endif %}
    {% empty %}
    <p>
        for循环的对象内部没有值
</p>
{% endfor %}

VIII。カスタムフィルタとラベル

タグinclusion_tag

以下の準備作業を完了します

templatetagsと呼ばれる新しいフォルダ名の名の下に1.アプリケーションで

PYフォルダファイル(mytagという)に任意の名前を作成します。2.

3.ファイルに次の2行のコードを記述する必要があります

django.templateインポートライブラリから

レジスタ=ライブラリ()

# 自定义过滤器
@register.filter(name='my_sum')
def index(a,b):
    return a+b

# 自定义标签
@register.simple_tag(name='my_baby')
def xxx(a,b,c,d):
    return '%s?%s?%s?%s'%(a,b,c,d)

# 自定义inclusion_tag
@register.inclusion_tag('test.html', name='myin')
def index1(n):
    l=[]
    for i in range(n):
        l.append(i)
    return {'l':l}

使用

自定义过滤器的使用
{% load mytag %}
<p>
    {{ 10|my_sum:90 }}
</p>

自定义标签的使用
{% load mytag %}
<p>
    {% my_baby 1 2 3 'hello world' %}
</p>
<p>自定义的过滤器可以在逻辑语句中而自定义的标签不可以</p>
        {% if 10|my_sum:100 %}
            <p>条件成立</p>
        {% endif %}

        {% if my_baby 1 2 3 4 %}
            <p>条件成立</p>
        {% endif %}
自定义inclusion_tag的使用
<p>
    {% load mytag %}
    {% myin 5 %}
</p>

总结
页面上想要使用他们 要统一导入
{% load mytag %}

IX。継承されたテンプレート

このページ上の領域のほとんどに共通する一つのページはテンプレートページとして使用することができます

人がこのページを継承して、対応する領域を変更する場合

先在模板页面上通过block实现划定区域
    {% block content %}
        模板页面的内容
    {% endblock %}

子页面中先导入整个模块
    {% extends '模板页面.html' %}
    修改特定的区域 通过实现划定好的区域名称
    {% block content %}
        子页面内容
    {% endblock %}

通常情况下 模板页面应该起码有三块区域
    {% block css %}
        模板页面内容
    {% endblock %}

    {% block content %}
        模板页面内容
    {% endblock %}

    {% block js %}
        模板页面内容
    {% endblock %}

    # 模板的block块越多 可扩展性越高
    
    还支持子页面调用父页面对应区域的内容 并且可以无限次调用
        {{ block.super }}

テンプレートのインポートX.

彼らはhtmlページは、通常は地元のスタイル完了しない場合にダウンモジュールとして使用する必要がHMLページ

{% 'はleft.html' %含みます}

おすすめ

転載: www.cnblogs.com/godlover/p/12164313.html