文法
テンプレートのレンダリング公式文書
レンダリングするテンプレートについて、あなたは2つのだけ特殊記号(構文)を覚えておく必要があります。
{{}}と{%}%
{{}}、{%%に関連するロジック}に関連付けられた変数。
二変量
{{名前}}変数:で使用Djangoテンプレート言語の構文をクリックします。
テンプレートエンジンが変数に遭遇すると、変数を計算し、その結果自分自身でそれを置き換えます。名前付き変数は任意の英数字とアンダースコア(「_」)の組み合わせが含まれます。変数名にはスペースや句読点を含めることはできません。
デプス問い合わせ牙城記号(。)テンプレート言語で特別な意味を持っています。テンプレートシステムはドット(「」)に遭遇すると、それはこの順序の問い合わせになります。
辞書引き(辞書引き)
プロパティやメソッドクエリ(属性やメソッドのルックアップ)
デジタルインデックスクエリ(数値索引参照)
注意事項:
- 計算結果の値が呼び出された場合は、パラメータなしで呼び出されます。呼び出しの結果は、テンプレートの値になります。
- 変数が存在しない場合、システムはデフォルトの設定で値string_if_invalidテンプレートオプションを、挿入します「」(空文字列)です。
いくつかの例:
ビューのコード:
def index(request):
import datetime
s = "hello"
l = [111, 222, 333] # 列表
dic = {"name": "yuan", "age": 18} # 字典
date = datetime.date(1993, 5, 2) # 日期对象
class Person(object):
def __init__(self, name):
self.name = name
def dream(self):
return 'dreamer'
person_yuan = Person("chao") # 自定义类对象
person_egon = Person("yantao")
person_alex = Person("jinxin")
person_list = [person_yuan, person_egon, person_alex]
return render(request, "index.html", {"l": l, "dic": dic, "date": date, "person_list": person_list})
# return render(request,'index.html',locals())
#locals()获取函数内容所有的变量,然后通过render方法给了index.html文件进行模板渲染,如果你图省事,你可以用它,但是很多多余的变量也被传进去了,效率低
テンプレートのサポート文言:
<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<!--取列表的第1个对象的name属性的值-->
<h4>类对象列表:{{ person_list.0.name }}</h4>
<!--取列表的第1个对象的dream方法的返回值,如果没有返回值,拿到的是none-->
<h4>类对象列表:{{ person_list.0.dream }}</h4>
注意:
调用对象里面的方法的时候,不需要写括号来执行,并且只能执行不需要传参数的方法,如果你的这个方法需要传参数,那么模板语言不支持,不能帮你渲染
なり、操作をレンダリングするテンプレートのエスケープがあるだろうときに我々は、テンプレートの文法に直接jsのコードを使用することに注意してくださいS = [「ヘクタール」、「xxは」]のデータは特別なシンボルとなっ要素を引用しました:
<script>
// 不加safe的话,引号会被转义。 // var a = {{ s }}
// var a = ['哈哈', 'xx'];
// console.log(a[0])
// 加上safe就正常了
var a = {{ s|safe }};
console.log(a[0]) // 还要注意,当我们模板渲染的时候,后端返回的数据是字符串的话,我们需要将{{ s }}外面加上引号 比如s = '哈哈' js中的写法 var a = '{{ s }}'
</script>
3つのフィルタ
変数の表示を変更するには、フィルタを使用して、Djangoテンプレート言語では。
フィルタの構文:{{値| FILTER_NAME:パラメータ}}
フィルタを適用|「」パイプ記号を使用してください。
例えば:{{名前|低い}}次に、変数名は、下部フィルタを適用した後、その値が表示されます。ここでアクションで下はすべて小文字のテキストです。
注意事項:
- フィルターは「チェーン」の動作をサポートしています。即ち、別のフィルタへの入力としてフィルタ出力。
- フィルタは、例えば、パラメータを受け入れることができる:{{SSS | truncatewords:30}}、SSSの最初の30ワードが表示されます。
- Filterパラメータには、それは引用符で囲む必要があり、スペースが含まれています。{|:「」}参加{リスト:}このようなカンマ、そのようなものとして、リストの要素を接続するために使用される空間として
- 「|」の周りにスペースはスペースを入れずにスペースなしではありません
Djangoテンプレート言語は約60内蔵のフィルタが用意されています。
デフォルト
変数がfalseまたは空の場合、デフォルト値が与えられました。それ以外の場合は、変数の値を使用します。
{{ value|default:"nothing"}}
値がnullであるか、値が渡されていない場合は、何も表示されません
長さ
文字列と値のリストに作用する、長さを返します。
{{値|長さ}}
4が表示され、その後、そのような値= [ 'A'、 'B'、 'C'、 'D']のように、長さの値を返します。
filesizeformat
「人間が読める」ファイルサイズ(例えば、としてフォーマット値'13 KB'
、'4.1 MB'
、'102 bytes'
、など)。例えば:
{{ value|filesizeformat }}
値が123456789である場合、出力は117.7メガバイトになります。
スライス
スライス、値の場合=「Hello World」の、だけでなく、他の種類のデータスライスの
{{value|slice:"2:-1"}}
日付
書式、値= datetime.datetime.now IF()
{{ value|date:"Y-m-d H:i:s"}}
、多くがある(などY、M、D、除く)日時で利用可能なパラメータが見えるように見ることができます興味を持っています。
安全
レンダリングHTMLタグは構文とJSタグは自動的にエスケープされる際に、明白な理由のために、これはセキュリティのためで、Djangoは誰かがあなたのレビューを書くための時間を与える場合は、このデータは、例えば、ユーザが追加されていることを心配して、テンプレート中のDjangoテンプレートいくつかのJSコード、レビュー提出、jsのコードは、あなたが悪い子の一部を実行することができないように、あなたを実行死のポップ・サイクルを書き、ブラウザはそれを使用することができるだろうが、それは常にああポップアップ表示されますされていませんこれは攻撃のXSSと呼ばれているので、ブラウザはあなたがそうさせません、あなたは脱出しました。しかし、時には我々はこれらのHTML要素がエスケープされたくない場合があり、例えば、我々はコンテンツ管理システムの操作を行い、記事の背景が変更された追加、これらの変更は、HTML修飾子を編集する同様のFCKeditorので上昇させることができますテキストは、ソースファイルはHTMLタグを保護することであるならば、自動的に表示され、脱出しました。それは私たちがフィルタリングすることができ、単一の変数である場合は自動Djangoは、二つの方法でHTMLをエスケープオフにするには|このコードを確保するための「安全な」方法は、エスケープする必要はありませんDjangoに伝えます。
私たちは、あなたがネットワークの応答の一部を通して見ることができ、ブラウザがレンダリングされた後に結果を確認するために、見て、ローカルネットワークに行ってきました。これは、すべての特別なシンボルタグであることがある、ラベル、包まれていませんDjangoはことを行います。
例えば:
値=「ポイントI」および値=「」
{{ value|safe}}
多くのサイトでは、あなたがコンテンツを提出するよう、他の人々はあなたがこれらの条件が含まれている場合、させてください、あなたの投稿の内容を検出し、その上でいくつかの敏感な言葉、特殊文字、ラベル、ポルノ、ギャンブルの語彙とをフィルタリングするためにあなたが提出した内容になりますあなたが提出し、実際には、このようなブログの庭のようにXSS攻撃を解決するための基本的な方法です。
truncatechars
文字の文字列が指定した文字数を超えている場合、それは切り捨てられます。翻訳可能な文字列が省略記号の末尾に列を切り捨てられます(「...」)。
パラメータ:文字の数が切り捨て
{{ value|truncatechars:9}} #注意:最后那三个省略号也是9个字符里面的,也就是这个9截断出来的是6个字符+3个省略号,有人会说,怎么展开啊,配合前端的点击事件就行啦
truncatewords
言葉が切断されているどのように多くの単語の特定の数、後の文字列を切り捨てます。
例如:‘hello girl hi baby yue ma’,
{{ value|truncatewords:3}} #上面例子得到的结果是 'hello girl h1...'
切る
同じ文字列を指定したすべての変数値を削除します
{{ value|cut:' ' }}
値が「私はあなたを愛して」の場合、出力「ILOVEYOU」。
加わります
ストリングの接続リスト、{{リスト|参加: ''}}、Pythonのstr.join(リスト)として
timesince(理解)
その日付からの経過時間に日付フォーマット(例えば、「4日間、6時間」)自己。
(比較点は今であるように、パラメータなし)比較日付の点として用いられる可変パラメータの任意の使用が含まれます。日が6月1日の1日にblog_date 2006年6月の深夜、午前8時の日付とCOMMENT_DATEインスタンス、2006の例であれば、例えば、以下は「8時間」を返します。
{{ blog_date|timesince:comment_date }}
minは、比較点に対して、将来の任意の日付に使用される最小単位であり、それは「0分」を返します。
timeuntil(理解)
それは今から指定した日付または日付と時刻までの時間を計測することを除いて、timesinceに似ています。たとえば、今日は2006年6月1日、およびconference_dateインスタンスである場合は、日付2006年6月29日に予約されている、{{conference_date | timeuntil}}は「4週間」に戻ります。
日付(というより、現在の)変数を含む比較点として使用されるオプションのパラメータの使用。FROM_DATEは、2006年6月22日が含まれている場合は、以下の「週」が返されます:
{{ conference_date|timeuntil:from_date }}
ここではいくつかの簡単な一般的なフィルターテンプレートは、あるより詳細な
4個のラベルタグ
タグは次のようになります{% tag %}
。タグが変数よりも複雑である:いくつかの追加情報が出力テキスト、番号で作成または論理ループを通る流れを制御するために、いくつかの変数は、テンプレートの後にロードするために使用されるであろう。いくつかのタグは開始タグと終了タグを必要とする(例えば、{% tag %} ...
タグのコンテンツ... {%のENDTAGの%})。
ラベルの
各要素を:のために書き、その後、自動的にサイクルのタブキー構造を生成し、サイクルは非常に基本的な、とても簡単な使用で、何の休憩など、複雑な機能はありません、あなたはJSを渡す必要があります
{% 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是循环器,通过点来使用功能
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等
以下のために...空
for
オプション付きラベル{% empty %}
空にするか、見つからないために述べ句は、操作があってもよいです。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
ラベルの場合
{% if %}
変数の評価を持って、その値が「真」である場合には(存在している、空ではなく、ない偽のブール値の型)、ブロック意志の出力に対応するコンテンツ。
{% if num > 100 or num < 0 %}
<p>无效</p> <!--不满足条件,不会生成这个标签-->
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %} <!--也是在if标签结构里面的-->
<p>凑活吧</p>
{% endif %}
もちろん、場合にのみ、他があるかもしれません
{% if user_list|length > 5 %} <!--结合过滤器来使用-->
七座豪华SUV
{% else %}
黄包车
{% endif %}
文は、サポートした場合、または==、>、<,! =、<=、> =、、で、ではありませんで、で、判断両側のスペース上の条件に注意を払うことはありません。
とともに
あなたはそれが非常に便利であるとき(たとえば、データベースへのアクセスなど)、「高価な」方法を何度も使用する必要があるとき、複素変数のエイリアスに使用されている複雑な変数をキャッシュ単純な名前を使用します
例えば:
等号の周りのスペースがないことに注意してください。
{% with total=business.employees.count %}
{{ total }} <!--只能在with语句体内用-->
{% endwith %}
若しくは
{% with business.employees.count as total %}
{{ total }}
{% endwith %}
csrf_token
私たちは道を投稿するフォームを送信すると、文句を言う私たちはCSRF内部のミドルウェアの構成設定内で償却するためにああを防御機構であることを覚えているだろう、それ自体は償却すべきではありませんが、それを使用する方法を学ばなければならない、とそうでありませんその動作がforbidenされていることを確認するために、この事を介して取得することができます。
このタグは、CSRF保護を使用しています
{%csrf_token%}を書き込むための任意の位置に(というどのフォームでフォームを注意してください)ページを形成しているの形で、レンダリングテンプレートに置き換えこの事提出したときに、このタグの隠された値は、ランダムな文字列です。私たちがページに追加するときにこの事もせずに、あなたは私はあなたにフォームをあげるフォームを介してデータを送信するときに、あなたは私はあなたを知っていたコンテンツを取る、まず最初に、バックエンドレンダリングされ、提出されました、私は私が最初に、私たちは後で学ぶものの値を格納するために、あなたにトークンを与えていない私たちはDjangoの背景はまたあなたにこの値をこの事で存在し、同じ値であるため、あなたが対応する検証を行うことができ、あなたを禁止します私はあなたが私のユーザーが通常のページの送信フォームのデータにこれを掲示しなければならない、またはあなたがこのランディングページに行くように私に尋ねなかったことはありません続く場合は、1つは、我々は、ユーザーがバックステージパスを与えると同じように、ライン上で知っているが、データを提出する直接シミュレーション要求、そしてIは、抗爬虫類や私のウェブサイト上の悪意のある攻撃、要求が違法であることを伝えることができ、ミドルウェア後に私たちはこの事で詳細に入るが、今あなたは、それが起こったのか理解Djangoは防衛のこのセットを追加します理由を理解する必要がある場合。
ポスト要求クローラーの簡単なシミュレーションを送信:
import requests
res = requests.post('http://127.0.0.1:8000/login/',data={
'username':'chao',
'password':'123'
})
print(res.text)
注記
{# ... #}
注意事項
- Djangoテンプレート言語は以下の文言をサポートしていない継続的な判断をサポートしていません。
{% if a > b > c %}
...
{% endif %}
- Djangoのテンプレート言語の優先順位属性が(理解)メソッドよりも大きく、
def xx(request):
d = {"a": 1, "b": 2, "c": 3, "items": "100"}
return render(request, "xx.html", {"data": d})
以上のように、私たちは、ページをレンダリングする方法をレンダリング辞書Dキーアイテムを渡すと、デフォルトのd.items()メソッド、テンプレート言語で、この時間があるを使用する場合:
{{ data.items }}
デフォルトの項目のキーはDがかかります。
ファイブテンプレートの継承
Djangoのテンプレートエンジンは継承されているテンプレートの最も強力で最も複雑な部分です。テンプレートの継承は、あなたのサイトのすべての要素が含まれている基本的な「スケルトン」テンプレートを作成することができます、そしてあなたはキルトのブロックをカバーすることができますテンプレートを定義することができます。
次の例から開始することにより、テンプレートの継承を理解することは簡単です:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>
<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>
</html>
このテンプレートは、我々はそれを呼び出すbase.html
、それは簡単なHTMLスケルトンが2ページレイアウトで使用することができます定義されています。その内容と「サブテンプレート」の仕事は、空のブロックを埋めます。
この例では、block
タグは、3つのコンテンツで満たされたキルトテンプレートブロックを定義することができます。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>
{% endfor %}
{% endblock %}
extends
タグは、ここで重要です。これは、このテンプレートが別のテンプレートを「継承」テンプレートエンジンに指示します。システムはステンシルテンプレートを処理すると、まず、それは親テンプレートを探します - この場合には、「base.html」です。
その時、テンプレートエンジンがわかりますbase.html
3つのblock
ラベルを、サブテンプレートの内容でブロックを交換します。blog_entries
出力の値は、次のようになります。
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>My amazing blog</title>
</head>
<body>
<div id="sidebar">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
</div>
<div id="content">
<h2>Entry one</h2>
<p>This is my first entry.</p>
<h2>Entry two</h2>
<p>This is my second entry.</p>
</div>
</body>
</html>
子テンプレートが定義されていませんのでご注意くださいsidebar
ブロックを、そのシステムは、親テンプレートの値を使用しています。親テンプレートの{% block %}
コンテンツ]タブは、常に代替コンテンツ(代替)として使用されています。
これは、コードの再利用の最大の程度を提供し、それは、ナビゲーション部の範囲で、より単純な共有コンテンツ領域、例えばにコンテンツを追加します。
ここでは、継承を使用するためのヒントをいくつか紹介します。
- テンプレートを使用している場合は
{% extends %}
ラベルを、それが最初のテンプレートタグでなければなりません。レンダリングテンプレートは、あなたがやっているかわからないDjangoのとき、他の状況下では、テンプレートの継承は、動作しません。 - 複数の基地テンプレートに設定し
{% block %}
、より優れたラベル。子テンプレートは、あなたが最も合理的なデフォルトのコンテンツブロックを埋めることができるように、テンプレートのすべての親のブロックを定義する必要があり、かつ1あなたが必要とする、その後、唯一の定義はありません、覚えておいてください。もう少しはあまり良いよりも優れているフック。 - あなた自身が多数のテンプレートでコンテンツを複製見つけた場合、それはおそらくあなたがテンプレートの親に内容を移動する必要があることを意味
{% block %}
しました。 - 親テンプレートのブロックの内容を取得する必要がある場合は、
{{ block.super }}
変数は、トリックを行います。あなたの代わりにそれを完全に上書きの親ブロックの内容に追加したい場合に便利です。データは、使用して挿入し{{ block.super }}
、必要であれば、それはすでに親テンプレートでは、エスケープされたため、(次のセクションを参照)、自動的にエスケープされることはありません。将子页面的内容和继承的母版中ブロック里面的内容同时保留
- 読みやすくするため、また、あなたの与えることができます
{% endblock %}
タグの名前を。例えば:
{% block content %}
...
{% endblock content %}
大規模なテンプレートでは、この方法は、あなたがはっきりとものを見るのを助けるする {% block %}
ラベルが閉じられています。
- 同じ名前の複数のテンプレートで定義することができない
block
タグ。
6パック
ページのコンテンツが別のファイルに格納され、ナビゲーション、フッター情報成分として、使用され、その後、必要な場合に使用されてもよく、次の構文により、ファイル内のどこにでも導入することができます。
{% include 'navbar.html' %}
例:以下のナビゲーションバーはnav.html、あります
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.c1{
background-color: red;
height: 40px;
}
</style>
</head>
<body>
<div class="c1">
<div>
<a href="">xx</a>
<a href="">dd</a>
</div>
</div>
</body>
</html>
ページの組み込みナビゲーションバー、test.htmlという
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% include 'nav.html' %}
<h1>xxxxxxxxxx</h1>
</body>
</html>
単純コンポーネントとプラグインとの間の差
组件是提供某一完整功能的模块,如:编辑器组件,QQ空间提供的关注组件 等。
而插件更倾向封闭某一功能方法的函数。
这两者的区别在 Javascript 里区别很小,组件这个名词用得不多,一般统称插件。
七つのカスタムタグやフィルタ
私たちは、これらの後の再訪を使用する場合:
1、
INSTALLED_APPS現在のアプリケーションのコンフィギュレーション設定で、simple_tagカスタムを見つけるために、それ以外の場合はできないジャンゴ。
2、
(モジュールの名前は唯一templatetags可能)でtemplatetagsモジュールのアプリを作成します
3、
my_tags.py:ような任意の.pyファイルを作成します
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
@register.filter
def filter_multi(v1,v2):
return v1 * v2
@register.simple_tag #和自定义filter类似,只不过接收更灵活的参数,没有个数限制。
def simple_tag_multi(v1,v2):
return v1 * v2
@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)
4、
htmlファイルからのインポートを使用する前にmy_tags.pyで作成したsimple_tagとフィルタを定義します
{% load my_tags %}
5、
(呼び出す方法)simple_tagとフィルタを使用します
-------------------------------.html
{% load xxx %}
# num=12
{{ num|filter_multi:2 }} #24
{{ num|filter_multi:"[22,333,4444]" }}
{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}
注意:フィルタは、他の文のために、後の場合で使用することができ、ないsimple_tag
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
inclusion_tag
戻すためのマルチHTMLコードセグメント
例:
templatetags / my_inclusion.py
from django import template
register = template.Library()
@register.inclusion_tag('result.html') #将result.html里面的内容用下面函数的返回值渲染,然后作为一个组件一样,加载到使用这个函数的html文件里面
def show_results(n): #参数可以传多个进来
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"data": data}#这里可以穿多个值,和render的感觉是一样的{'data1':data1,'data2':data2....}
テンプレート/スニペット/ result.html
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
テンプレート/ index.htmlを
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>inclusion_tag test</title>
</head>
<body>
{% load inclusion_tag_test %}
{% show_results 10 %}
</body>
</html>
八個の静的ファイル関連
JS、CSS、IMGなどの静的ファイルと呼ばれ、その後、ジャンゴ静的ファイルの構成は、我々は、この上のコンテンツを書くには、設定ファイルの設定を記述する必要があります。
# STATIC_URL = '/xxx/' #别名,随便写名字,但是如果你改名字,别忘了前面页面里面如果你是通过/xxx/bootstrap.css的时候,如果这里的别名你改成了/static/的话,你前端页面的路径要改成/static/bootstrap.css。所以我们都是用下面的load static的方式来使用静态文件路径
STATIC_URL = '/static/' #别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'jingtaiwenjian'), #注意别忘了写逗号,第二个参数就是项目中你存放静态文件的文件夹名称
]
ディレクトリ:エイリアスは他の人があなたの静的フォルダの名前を知ることができない、または他の誰かがこのフォルダのパスを通して攻撃することができるようになりますように、あなたが見ることができ試運転段階を経由して、ブラウザ上の安全機構は、エイリアス名です。
フロントページの導入は、別名も変更できるので、静的ファイルを書き込んだので、別名マッピングの方法により、静的なファイルパスを取得するために、静的エイリアス負荷を通るパスを見つけるために時間を使います
{%静的%}
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
JSファイルを参照するときに使用します。
{% load static %}
<script src="{% static "mytest.js" %}"></script>
ファイル内で使用された多くは、変数として保存することができます
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
{%get_static_prefix%}
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
若しくは
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
htmlの相対パスを検討するために書かれ、質問を提出することを注意してください:
例:
<form action="/login/"></form>
<img src="/static/1.jpg" alt="">
等标签需要写路径的地方,如果写的是相对路径,那么前置的/这个斜杠必须写上,不然这个请求会拼接当前网页的路径来发送请求,就不能匹配我们的后端路径了