1. Function-Based Views
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 Routing
# 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 Template Language
<!-- 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. Custom Template Tags & Filters
# 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. Static & Media Files
# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [BASE_DIR / 'static']
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
Bài tiếp theo: Class-Based Views & Forms — ListView, CreateView, ModelForms.