一、Djangoの静的ファイルの設定(settings)
STATIC_URL = '/static/' # 調用名
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"), # 実際のファイル名
)
Djangoは、調用名と実際のファイル名の間にマッピングを行います。静的ファイルを参照する際には、調用名を使用する必要があります。
#<script src="/static/jquery-3.1.1.js"></script>
#<script src="/statics/jquery-3.1.1.js"></script> ← エラー
推奨する方法:
STATIC_URL = '/static/'
フロントエンド:
{% load static %}
<script src="{% static 'jquery-1.8.2.min.js' %}"></script>
二、DjangoのURLシステム(ルーティング)
1、url - ビューへのルーティング
urlpatterns = [
url(正規表現, ビューフункци名, kwargs=None, name=None),
]
def url(regex, view, kwargs=None, name=None):
kwargs:ビューに渡すデフォルトのパラメータ(辞書形式)
name:別名(例:'xxx')
例えば:
<form action="{% url 'xxx' %}" method="post">
このフォームは指定されたルートに送信されます。ルートが一致したら、後のルートはすべて無視されます。したがって、ルートの終端に$を付けた方が良いです。
2、無名グループと名前付きグループ
url(r'^articles/([0-9]{4})/$', views.year_archive), # 無名グループ
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 名前付きグループ
名前付きグループでは、yearがビューのキーワード引数として渡されます。
3、ルートのディストリビューション
url(r'^article/', include(("article.urls", "article"), namespace="article")),
def include(arg, namespace=None):
if isinstance(arg, tuple):
urlconf_module, app_name = arg
else:
urlconf_module = arg
# 以下略
ビューのコード例:
url(r'^article/', include(("app.urls", "app"), namespace="article")),
app_nameとnamespaceの違いについては、以下を参照してください:参考文献
三、Djangoのビュー(ビュー関数)
Djangoのビューでは、HttpRequestとHttpResponseの2つの重要なオブジェクトを使用します。また、request.POST.get('')メソッドがよく用いられます。
四、テンプレートの構文
HTMLコードと論理制御コードの組み合わせ
1、変数 - {{ xxx }}
①深層変数のアクセス - 点符号
[1]、リストの要素アクセス {{ items.2 }}
[2]、辞書の値のアクセス {{ person.name }}
[3]、オブジェクトの属性のアクセス {{ date.year }}(date = datetime.date(1993,5,2))
[4]、カスタムクラスオブジェクトの属性のアクセス {{ person.firstname }}
[5]、メソッドの呼び出し {{ var.upper }} - 注意:パラメータのないメソッドのみ呼び出せます
②変数のフィルタ - filter
フィルタの使用例:
{{ value1|upper }}<br>
{{ value2|add:3 }}<br>
{{ value3|cut:' ' }}<br>
{{ value4|date:'Y-m-d' }}<br>
{{ value5|default:'空の' }}<br>
{{ value6|safe }}<br>
{{ value6|striptags }}<br>
{{ value7|filesizeformat }}<br>
{{ value7|first }}<br>
{{ value7|length }}<br>
{{ value7|slice:":-1" }}<br>
{{ value8|urlencode }}<br>
View Code
2、タグ(tag) - {% tags %}
①{% if %}
②{% for %}
breakやcontinueはサポートされませんが、forループ変数(forloop.counter)を使用してカウントが可能です。
③{% csrf_token %}
注意:render_to_responseメソッドを使用したビューでは、{% csrf_token %}は機能しません。
④{% url %}
⑤{% with %}
⑥{% verbatim %} - 出力禁止
⑦{% load %}
3、カスタムフィルタとシンプルタグ
①アプリケーション内にtemplatetagsモジュールを作成します。
②templatetagsディレクトリ内にPythonファイルを作成します(例:my_tags.py)。
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def multiply_filter(v1, v2):
return v1 * v2
@register.simple_tag
def multiply_simple_tag(v1, v2):
return v1 * v2
@register.simple_tag
def custom_input(id, arg):
result = f"<input type='text' id='{id}' class='{arg}' />"
return mark_safe(result)
View Code
③テンプレートファイルでカスタムフィルタとシンプルタグを読み込む:
{% load my_tags %}
View Code
④フィルタとシンプルタグの使用例:
{{ num|multiply_filter:2 }} # 出力:24
{{ num|multiply_filter:"[22,333,4444]" }}
{% multiply_simple_tag 2 5 %} # 出力:2*5=10
{% multiply_simple_tag num 5 %}
View Code
注意:フィルタは{% if %}や{% for %}内でも使用可能です。
{% if num|multiply_filter:30 > 100 %}
{{ num|multiply_filter:30 }}
{% endif %}
View Code
4、includeとextends
①{% include xxx %} - 子テンプレートの含み込み
②{% extends xxx %} - 親テンプレートの継承(必須:テンプレートの最初に記述)
{% block xxx %}{% endblock %} - ブロックの定義
注:{{ block.super }}は親テンプレートのブロック内容を保持しながら、子テンプレートで追加できます。
五、Models
Djangoのモデルはdjango.db.models.Modelクラスを継承します。モデル間の関係は1対1(外键 + unique)、1対多(外键)、多対多(2つの外键)があります。
1、モデルの主要なフィールドタイプ
具体的なフィールドタイプについては、以下を参考してください:参考文献
2、フィールドの重要パラメータ
フィールドの詳細については、上記の参考文献を参照してください。
3、表の操作(CRUD)
①追加(Create)
from app01.models import *
# create方式一: Author.objects.create(name='Alvin')
# create方式二: Author.objects.create(**{"name":"alex"})
# save方式一: author=Author(name="alvin")
author.save()
# save方式二: author=Author()
author.name="alvin"
author.save()
注意:外键はデフォルトで主キーを参照します。
②削除(Delete)
# 個別削除
Author.objects.filter(id=1).delete()
# 連鎖削除(OneToMany)
Book.objects.filter(id=1).delete()
# 多対多削除
Book.objects.filter(id=1).delete()
Book.objects.filter(id=1).authors.clear()
③更新(Update)
# 全体更新
Book.objects.all().update(price=100)
# 個別更新
book = Book.objects.get(id=1)
book.price = 100
book.save()
# 多対多更新
book.authors.clear()
book.authors.add(Author.objects.get(id=1), Author.objects.get(id=2))
④検索(Retrieve)
# 条件検索
Book.objects.filter(title='Python').values('id')
# 複数検索
Book.objects.all().values('title', 'price')
# 唯一検索
Book.objects.get(id=1)
4、QuerySetの非アクティブ化
QuerySetは実際のSQLが実行されるまでデータを保持します。キャッシュを活用し、大きいデータセットを扱う際にはiterator()を使用してください。
5、単一テーブルの条件検索と多テーブルの結合検索
# 単一テーブルの条件検索
Book.objects.filter(price__gt=50).values('title')
# 多テーブルの結合検索
Book.objects.filter(publisher__name='出版社A').values('title')
6、集約検索とグルーピング
# 集約
Book.objects.filter(genre='プログラミング').aggregate(Sum('price'))
# グルーピング
Book.objects.filter(genre='プログラミング').values('genre').annotate(Sum('price'))
7、FクエリとQオブジェクト
参考文献:参考文献