Djangoのヒント集

一、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オブジェクト

参考文献:参考文献

タグ: Django Python Webフレームワーク

8月24日 08:20 投稿