- Hệ thống URL
Django tự động thêm dấu "/" vào cuối URL nếu không có và xử lý định tuyến theo thứ tự xuất hiện.
1. Định tuyến cơ bản
from django.urls import path
urlpatterns = [
path('home/', views.home),
]
2. Định tuyến với biểu thức chính quy
from django.urls import re_path
urlpatterns = [
re_path(r'^page/\d+', views.page_view),
]
3. Truyền tham số qua URL
# urls.py
from django.urls import re_path
urlpatterns = [
re_path(r'^post/(\d+)/$', views.post_detail),
]
# views.py
def post_detail(request, post_id):
return HttpResponse(f"Chi tiết bài viết #{post_id}")
4. Sử dụng tên tham số
# urls.py
from django.urls import re_path
urlpatterns = [
re_path(r'^article/(?P<year>[0-9]{4})/$', views.article_by_year),
]
# views.py
def article_by_year(request, year):
return HttpResponse(f"Bài viết năm {year}")
5. Bao gồm các URL khác
from django.urls import include, path
urlpatterns = [
path('blog/', include('blog.urls')),
]
- Hệ thống mẫu (Templates)
1. Biến đơn giản
<p>{{ variable }}</p>
Truy cập phần tử danh sách:
<ul>
<li>{{ list.0 }}</li>
<li>{{ list.1 }}</li>
</ul>
Truy cập giá trị từ từ điển:
<p>{{ dictionary.key }}</p>
2. Cấu trúc điều kiện
{% if condition %}
Nội dung khi đúng
{% else %}
Nội dung khi sai
{% endif %}
3. Vòng lặp
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
Biến đặc biệt trong vòng lặp:
{{ forloop.counter }}
{{ forloop.first }}
{{ forloop.last }}
4. Hàm tích hợp
<p>{{ "HELLO"|lower }}</p>
Kiểm tra chia hết:
{% if forloop.counter|divisibleby:"2" %}
<tr class="even">
{% else %}
<tr class="odd">
{% endif %}
5. Kế thừa mẫu
{% extends "base.html" %}
{% block content %}
Nội dung riêng
{% endblock %}
6. Nhúng mã HTML
{% include "header.html" %}
- Mô hình (Models)
1. Cấu trúc lớp
a) Kiểu dữ liệu cơ bản
from django.db import models
class User(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField()
bio = models.TextField()
b) Quan hệ giữa bảng
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
c) Các trường phổ biến
IntegerField
CharField(max_length=...)
DateField(auto_now=True)
BooleanField(default=False)
2. Thao tác với bảng
a) Cơ bản
# Thêm
user = User.objects.create(username='test', email='test@example.com')
# Lấy
users = User.objects.all()
# Xóa
User.objects.filter(username='test').delete()
# Cập nhật
User.objects.filter(username='test').update(email='new@example.com')
b) Nâng cao
# Đếm
count = User.objects.filter(is_active=True).count()
# Điều kiện lớn hơn/nhỏ hơn
active_users = User.objects.filter(last_login__gt='2023-01-01')
# Trong tập hợp
selected_users = User.objects.filter(id__in=[1, 2, 3])
# Chứa chuỗi
search_results = User.objects.filter(username__icontains='admin')
# Sắp xếp
sorted_users = User.objects.order_by('-last_login')
c) Liên kết bảng
# One-to-One
profile = Profile.objects.get(user__username='test')
# Foreign Key
posts = Post.objects.filter(author__username='test')
# Many-to-Many
tags = Tag.objects.filter(post__title__icontains='Django')