Chuyển đến nội dung chính

レッスン 3: ビュー、URL、テンプレート

関数ベースのビュー、URL ルーティング、URL 名前空間。 Django テンプレート言語、テンプレートの継承、カスタム テンプレート タグ/フィルター。静的ファイル、メディア ファイル。

💻 プログラミング — レッスン 3 レッスン 3: ビュー、URL、テンプレート

Django: 基本から上級まで

パート 1: Django の基礎

xdev.asia

1. 機能ベースのビュー

from django.http import JsonResponse, HttpRequest
from django.shortcuts import render, get_object_or_404
from .models import Product

def product_list(request: HttpRequest):
    products = Product.objects.filter(is_active=True)
    return render(request, 'products/list.html', {'products': products})

def product_detail(request: HttpRequest, slug: str):
    product = get_object_or_404(Product, slug=slug, is_active=True)
    return render(request, 'products/detail.html', {'product': product})

# API view
def api_products(request: HttpRequest):
    products = Product.objects.filter(is_active=True).values('id', 'name', 'price')
    return JsonResponse(list(products), safe=False)

2. URLルーティング

# config/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('products/', include('products.urls')),
    path('api/', include('api.urls')),
]

# products/urls.py
from django.urls import path
from . import views

app_name = 'products'

urlpatterns = [
    path('', views.product_list, name='list'),
    path('<slug:slug>/', views.product_detail, name='detail'),
    path('category/<int:pk>/', views.category_detail, name='category'),
]

# Template usage: {% url 'products:detail' slug=product.slug %}

3. Django テンプレート言語

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
  <title>{% block title %}My Site{% endblock %}</title>
  {% load static %}
  <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
  {% block content %}{% endblock %}
</body>
</html>

<!-- templates/products/list.html -->
{% extends 'base.html' %}

{% block title %}Sản phẩm{% endblock %}

{% block content %}
  <h1>Sản phẩm ({{ products|length }})</h1>

  {% for product in products %}
    <div class="product">
      <h2><a href="{% url 'products:detail' slug=product.slug %}">{{ product.name }}</a></h2>
      <p>{{ product.price|floatformat:0 }}đ</p>
      {% if product.stock > 0 %}
        <span class="in-stock">Còn hàng</span>
      {% else %}
        <span class="out-of-stock">Hết hàng</span>
      {% endif %}
    </div>
  {% empty %}
    <p>Không có sản phẩm nào.</p>
  {% endfor %}
{% endblock %}

4. カスタムテンプレートのタグとフィルター

# products/templatetags/product_tags.py
from django import template

register = template.Library()

@register.filter
def currency(value):
    """{{ price|currency }} → 1,000,000đ"""
    return f"{int(value):,}đ"

@register.simple_tag
def featured_products(count=5):
    from products.models import Product
    return Product.objects.filter(is_active=True)[:count]

@register.inclusion_tag('products/_card.html')
def product_card(product):
    return {'product': product}

5. 静的ファイルとメディア ファイル

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [BASE_DIR / 'static']

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

次の記事: クラスベースのビューとフォーム — ListView、CreateView、ModelForms。