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

第 3 課:檢視、URL 和模板

基於函數的視圖、URL 路由、URL 命名空間。 Django 模板語言、模板繼承、自訂模板標籤/過濾器。靜態文件、媒體文件。

💻 程式設計 — 第 3 課 第 3 課:檢視、URL 和模板

Django:從基礎到高級

第 1 部分:Django 基礎知識

亞洲開發網

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。