Quản lý URL, Mẫu và Mô hình trong Django

  1. 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')),
]
  1. 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" %}
  1. 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')

Thẻ: Django web-development python

Đăng vào ngày 12 tháng 7 lúc 06:40