Django là một framework phát triển web miễn phí, mã nguồn mở và cấp cao được sử dụng rộng rãi. Nó cung cấp nhiều tính năng “có sẵn” cho nhà phát triển, giúp quá trình phát triển diễn ra nhanh chóng. Tuy vậy, các website xây dựng bằng Django vẫn đảm bảo an toàn, khả năng mở rộng và dễ bảo trì.
Mục tiêu
Mục tiêu của hướng dẫn này là xây dựng một ứng dụng blog, trong đó nội dung blog có thể được tạo và cập nhật thông qua bảng điều khiển quản trị. Nội dung blog được hiển thị trên trang và có thể xóa khi cần. Toàn bộ ứng dụng cung cấp chức năng CRUD (Create, Read, Update, Delete).
Hướng dẫn này không sử dụng các công nghệ FrontEnd như Javascript, CSS, v.v., mà tập trung vào các khái niệm cơ bản nhưng thiết yếu cần có trong mọi dự án Web với Django.
Thiết lập cần thiết
- Git Bash: Người dùng của mọi hệ điều hành đều có thể sử dụng. Tất cả lệnh liên quan đến Django và lệnh Unix sẽ được thực hiện qua công cụ này. Để tải Git Bash: Click Me.
- Trình soạn thảo văn bản: Có thể dùng bất kỳ trình soạn thảo nào như Sublime Text hoặc Visual Studio Code. Trong dự án sau đây, sử dụng Sublime Text.
- Python 3: Tải phiên bản mới nhất của Python tại Download Python.
Lưu ý: Bạn có thể dễ dàng theo dõi hướng dẫn này nếu hiểu các kiến thức cơ bản về Python và biết về vòng lặp, hàm, lớp, v.v., cùng với một chút kiến thức về bash hoặc dòng lệnh.
Môi trường ảo (Virtual Environment)
Môi trường ảo đóng vai trò quản lý phụ thuộc cho các dự án liên quan đến Python. Nó hoạt động như một vùng chứa độc lập, nơi các gói Python và phiên bản cần thiết cho một dự án cụ thể được cài đặt. Vì các phiên bản mới của Python, Django hoặc các gói sẽ liên tục phát hành, nên nhờ Môi trường ảo bạn có thể làm việc với các phiên bản cũ phù hợp với dự án của mình. Tóm lại, bạn có thể bắt đầu một dự án độc lập dùng Django phiên bản 2.0 trong khi một dự án độc lập khác dùng Django 3.0 cũng chạy trên cùng máy tính.
Lưu ý: Có nhiều cách tạo Môi trường ảo, nhưng dưới đây chỉ trình bày một cách.
Các bước tạo Môi trường ảo
- Bạn có thể tạo thư mục mới tên 'project-blog' bằng lệnh 'mkdir' trên Desktop.
-
Chuyển vào thư mục 'project-blog' bằng lệnh 'cd'.

-
Tạo môi trường ảo bằng lệnh 'python -m venv env', trong đó env là môi trường ảo của chúng ta, có thể kiểm tra bằng lệnh 'ls'.

-
Kích hoạt Môi trường ảo: Kích hoạt bằng lệnh 'source', trong đó thư mục 'Scripts' cần được bật/ kích hoạt.

Nếu kích hoạt thành công, 'env' sẽ hiển thị trong ngoặc đơn.
- Cài đặt Django: Dùng 'pip install django' để cài Django trong Môi trường ảo của bạn.

Lưu ý: Người dùng Linux và Mac cần dùng cụ thể 'python3' trong lệnh vì Python phiên bản 2 thường đã được cài sẵn trên máy. Ngoài ra, hiện nay nên dùng phiên bản 3, vì Python đã ngừng hỗ trợ phiên bản 2 sau năm 2020.
Tạo một dự án Django
- Bước đầu tiên là tạo dự án bằng lệnh 'django-admin startproject
project_name', trong đó 'project_name' ở đây là 'django_blog'. Lệnh này sẽ tạo nhiều tệp bên trong dự án mới; bạn có thể tìm hiểu thêm trong tài liệu Django nếu cần.

- Chuyển vào thư mục dự án vừa tạo bằng lệnh 'cd' và dùng 'ls' để xem các tệp đã tạo.

- Bạn có thể chạy dự án bằng 'python manage.py runserver'.

- Có thể xem dự án trong trình duyệt ưa thích (Google Chrome, Mozilla Firefox, v.v.). Mở trình duyệt và gõ 'localhost:8000' hoặc '127.0.0.1:8000' trên thanh địa chỉ như bên dưới.

Lưu ý: Để có trang giống như trên, máy chủ trong bash cần đang chạy nền. Bạn có thể dừng máy chủ thủ công khi cần bằng 'Ctr+C' trên Windows/Linux và 'Cmd+C' trên Mac.
Bắt đầu dự án Django mới
Để tạo một dự án mới trong Django, luôn gồm hai bước như sau.
- Bước đầu là tạo một app bằng lệnh 'python manage.py startapp
app_name', trong đó app_name ở đây là 'blog'. Trong Django, một dự án có thể có nhiều app, mỗi app đảm nhiệm một chức năng riêng cho dự án.

- Bước hai là để dự án biết về app vừa tạo bằng cách chỉnh sửa phần INSTALLED_APP trong 'django_blog/settings.py'.

Thay đổi trong Models
Django dùng 'SQLite' làm cơ sở dữ liệu mặc định, nhẹ và phù hợp cho các dự án nhỏ, điều này ổn cho dự án này. Django sử dụng 'Object Relational Mapper (ORM)', giúp làm việc với cơ sở dữ liệu rất dễ dàng. Bạn không viết mã SQL trực tiếp; thay vào đó, các bảng cơ sở dữ liệu được tạo thông qua từ khóa 'class' trong 'models.py'.
Bên trong 'blog/models.py', bạn cần tạo một model mới tên 'Post'. Đây là một lớp sẽ trở thành một bảng trong cơ sở dữ liệu và hiện kế thừa từ 'models.Model'. Như trong một blog tiêu chuẩn, mỗi 'Post' chứa một tiêu đề, sẽ là một trường CharField. Đây là cột dạng văn bản và yêu cầu đối số bắt buộc 'max_length', ở đây là 50. Ngoài ra còn có trường 'content' là TextField, chứa nội dung chi tiết của 'Post' như trong blog. Phương thức kép gạch dưới ('str') được định nghĩa để ghi đè trường 'title' và trả về tên 'title' thực thay vì đối tượng.

Tạo migrations
'python manage.py makemigrations' là bước đầu tiên, lệnh sẽ đọc 'models.py' sau khi bạn tạo. Nó tạo một thư mục mới tên 'migrations' với tệp '0001_initial.py', có thể dùng xuyên suốt các hệ quản trị cơ sở dữ liệu.

Áp dụng migration vào cơ sở dữ liệu
Đây là bước thứ hai, trong đó 'python manage.py migrate' đọc thư mục 'migrations' vừa tạo, tạo cơ sở dữ liệu và cập nhật khi có thay đổi trong model.

Đăng ký với trang quản trị
Chuyển đến 'blog/admin.py' và import model 'Post' bằng 'from .models import Post'. Để đăng ký model với trang quản trị, dùng lệnh 'admin.site.register(Post)'.

Tạo SuperUser và xem trong bảng điều khiển quản trị
Bạn cần tạo SuperUser trước khi truy cập trang 'admin'. Thực hiện bằng 'winpty python manage.py createsuperuser'.

Lưu ý: winpty là lệnh riêng của bash dùng để giao tiếp với các chương trình Console trên Windows.
Chạy máy chủ nền trong bash bằng lệnh python manage.py runserver. Mở trình duyệt và nhập URL sau.

Sau đó điền thông tin của bạn, tức tên người dùng và mật khẩu đã tạo trước đó:

Xem bảng điều khiển quản trị với model 'Post' vừa tạo.

Thay đổi nội dung của 'Post' bằng cách nhấn nút 'Add'. Điền thông tin và 'Save' lại.

Thay đổi trong views và urls
Chuyển đến 'blog/views.py' và chỉnh sửa như bên dưới. Thêm hàm 'blog_list', nhận request. Thực hiện truy vấn để lấy tất cả đối tượng được tạo bằng 'Post.objects.all()' và lưu vào post. Tạo một dictionary mới tên 'context' để truyền đối tượng dưới dạng khóa và lấy trong template 'blog-list.html', thông qua việc trả về phản hồi với render.

Tạo tệp mới tên 'urls.py' trong 'django_blog/blog' và thêm các thay đổi sau. Có import tương đối đến view 'blog_list', đồng thời có 'urlpatterns' là danh sách các đường dẫn đến trang cụ thể trên website. Hiện tại, phần <b'path' chứa chuỗi rỗng và tên của view.

Chuyển đến 'django_blog/urls.py', import include và chỉnh sửa 'urlpatterns'. Thêm đường dẫn đến URLs của app thông qua include. Khi người dùng truy cập 'posts/', họ sẽ được chuyển đến 'blog.urls.'
Tạo và chỉnh sửa Templates
Tạo thư mục templates, nơi lưu các tệp 'HTML' và dùng ngôn ngữ template riêng tên 'Jinja2'. Thư mục cần đặt theo quy ước 'templates/blog/blog_list.html'.

Như bên dưới, có cú pháp liên quan đến 'HyperTextMarkup Language (HTML) với 'h1' cho tiêu đề lớn và danh sách không thứ tự (ul) với phần tử danh sách li. Đồng thời, dùng cú pháp vòng lặp 'for' của 'Jinja 2' để lặp qua đối tượng 'blog_list' được truyền làm khóa từ 'blog/views.py', mỗi phần tử gọi là 'list'.

Xem 'title' có tên 'First Post' trên trang web.

Hãy thêm một mục nữa trong trang quản trị như trên và đặt title cho bài thứ hai là 'Second Post.'

Sau khi thêm và tải lại trang chủ, thông tin sẽ được cập nhật.

Chi tiết cho từng bài viết
Bạn sẽ tạo trang riêng cho từng bài, chứa thông tin về tiêu đề và nội dung của bài đó. 'url' sẽ là "localhost:8000/posts/'id'" trong đó id là số duy nhất hoặc khóa chính gắn với mỗi 'Post' do Django cấp.
Hãy tạo hàm 'blog_detail' trong 'blog/view.py' , nhận id làm tham số. Đồng thời thực hiện truy vấn để lấy đúng id và lưu vào 'each_post'. Tương tự như trên, thông tin cần thiết được truyền làm context đến 'blog_detail.html'.

URL trong 'blog/urls.py' được thay đổi, trong đó path chứa '<id>' để nhận id duy nhất dạng số nguyên. Giả sử người dùng truy cập 'posts/' sẽ thấy tất cả bài viết, còn khi vào 'posts/1' chỉ thấy thông tin của bài viết đầu tiên.

Tạo tệp mới 'blog/blog_detail.html' và thực hiện các thay đổi sau. Vì blog_detail được truyền trong context, 'title' và 'content' có thể truy cập bằng ký pháp dấu chấm.

Mở URL trong trình duyệt và nhập tương tự để xem từng bài viết. Do 'id' của mục đầu tiên là '1', mục thứ hai là '2' và cứ thế cho các mục mới.

Xóa bài viết
Định nghĩa blog_delete, nhận request và id. Thực hiện truy vấn 'Post.objects.get(id=id)' để lấy đối tượng có id duy nhất và lưu vào each_post. Sau đó gọi 'each_post.delete()' để xóa 'Post'. Cuối cùng import HttpResponseRedirect từ module 'django.http' để chuyển hướng trang về '/posts/'

. Trong 'urls.py', import 'blog_delete' và đặt path là '<id>/delete', trong đó id kèm từ delete ở cuối sẽ xóa đối tượng hoặc thông tin tương ứng.

Hãy xóa bài viết bằng cách gõ như sau trong 'urls.py'.

Cuối cùng, trang sẽ được chuyển hướng về '/posts' khi gọi 'posts/1/delete/' trong trường hợp trên trang chủ chỉ có một bài.

Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn! Bạn đã học các kiến thức cơ bản về phát triển Web với Django và hiểu chức năng CRUD. Để biết thêm chi tiết về các chủ đề cụ thể, hãy truy cập Tài liệu Django.
Tài liệu tham khảo:
Django là một framework phát triển web miễn phí, mã nguồn mở và cấp cao được sử dụng rộng rãi. Nó cung cấp nhiều tính năng “có sẵn” cho nhà phát triển, giúp quá trình phát triển diễn ra nhanh chóng. Tuy vậy, các website xây dựng bằng Django vẫn đảm bảo an toàn, khả năng mở rộng và dễ bảo trì.
Mục tiêu
Mục tiêu của hướng dẫn này là xây dựng một ứng dụng blog, trong đó nội dung blog có thể được tạo và cập nhật thông qua bảng điều khiển quản trị. Nội dung blog được hiển thị trên trang và có thể xóa khi cần. Toàn bộ ứng dụng cung cấp chức năng CRUD (Create, Read, Update, Delete).
Hướng dẫn này không sử dụng các công nghệ FrontEnd như Javascript, CSS, v.v., mà tập trung vào các khái niệm cơ bản nhưng thiết yếu cần có trong mọi dự án Web với Django.
Thiết lập cần thiết
Lưu ý: Bạn có thể dễ dàng theo dõi hướng dẫn này nếu hiểu các kiến thức cơ bản về Python và biết về vòng lặp, hàm, lớp, v.v., cùng với một chút kiến thức về bash hoặc dòng lệnh.
Môi trường ảo (Virtual Environment)
Môi trường ảo đóng vai trò quản lý phụ thuộc cho các dự án liên quan đến Python. Nó hoạt động như một vùng chứa độc lập, nơi các gói Python và phiên bản cần thiết cho một dự án cụ thể được cài đặt. Vì các phiên bản mới của Python, Django hoặc các gói sẽ liên tục phát hành, nên nhờ Môi trường ảo bạn có thể làm việc với các phiên bản cũ phù hợp với dự án của mình. Tóm lại, bạn có thể bắt đầu một dự án độc lập dùng Django phiên bản 2.0 trong khi một dự án độc lập khác dùng Django 3.0 cũng chạy trên cùng máy tính.
Lưu ý: Có nhiều cách tạo Môi trường ảo, nhưng dưới đây chỉ trình bày một cách.
Các bước tạo Môi trường ảo
Chuyển vào thư mục 'project-blog' bằng lệnh 'cd'.

Tạo môi trường ảo bằng lệnh 'python -m venv env', trong đó env là môi trường ảo của chúng ta, có thể kiểm tra bằng lệnh 'ls'.

Kích hoạt Môi trường ảo: Kích hoạt bằng lệnh 'source', trong đó thư mục 'Scripts' cần được bật/ kích hoạt.

Nếu kích hoạt thành công, 'env' sẽ hiển thị trong ngoặc đơn.
Lưu ý: Người dùng Linux và Mac cần dùng cụ thể 'python3' trong lệnh vì Python phiên bản 2 thường đã được cài sẵn trên máy. Ngoài ra, hiện nay nên dùng phiên bản 3, vì Python đã ngừng hỗ trợ phiên bản 2 sau năm 2020.
Tạo một dự án Django
project_name', trong đó 'project_name' ở đây là 'django_blog'. Lệnh này sẽ tạo nhiều tệp bên trong dự án mới; bạn có thể tìm hiểu thêm trong tài liệu Django nếu cần.Lưu ý: Để có trang giống như trên, máy chủ trong bash cần đang chạy nền. Bạn có thể dừng máy chủ thủ công khi cần bằng 'Ctr+C' trên Windows/Linux và 'Cmd+C' trên Mac.
Bắt đầu dự án Django mới
Để tạo một dự án mới trong Django, luôn gồm hai bước như sau.
app_name', trong đó app_name ở đây là 'blog'. Trong Django, một dự án có thể có nhiều app, mỗi app đảm nhiệm một chức năng riêng cho dự án.Thay đổi trong Models
Django dùng 'SQLite' làm cơ sở dữ liệu mặc định, nhẹ và phù hợp cho các dự án nhỏ, điều này ổn cho dự án này. Django sử dụng 'Object Relational Mapper (ORM)', giúp làm việc với cơ sở dữ liệu rất dễ dàng. Bạn không viết mã SQL trực tiếp; thay vào đó, các bảng cơ sở dữ liệu được tạo thông qua từ khóa 'class' trong 'models.py'.
Bên trong 'blog/models.py', bạn cần tạo một model mới tên 'Post'. Đây là một lớp sẽ trở thành một bảng trong cơ sở dữ liệu và hiện kế thừa từ 'models.Model'. Như trong một blog tiêu chuẩn, mỗi 'Post' chứa một tiêu đề, sẽ là một trường CharField. Đây là cột dạng văn bản và yêu cầu đối số bắt buộc 'max_length', ở đây là 50. Ngoài ra còn có trường 'content' là TextField, chứa nội dung chi tiết của 'Post' như trong blog. Phương thức kép gạch dưới ('str') được định nghĩa để ghi đè trường 'title' và trả về tên 'title' thực thay vì đối tượng.

Tạo migrations
'python manage.py makemigrations' là bước đầu tiên, lệnh sẽ đọc 'models.py' sau khi bạn tạo. Nó tạo một thư mục mới tên 'migrations' với tệp '0001_initial.py', có thể dùng xuyên suốt các hệ quản trị cơ sở dữ liệu.

Áp dụng migration vào cơ sở dữ liệu
Đây là bước thứ hai, trong đó 'python manage.py migrate' đọc thư mục 'migrations' vừa tạo, tạo cơ sở dữ liệu và cập nhật khi có thay đổi trong model.

Đăng ký với trang quản trị
Chuyển đến 'blog/admin.py' và import model 'Post' bằng 'from .models import Post'. Để đăng ký model với trang quản trị, dùng lệnh 'admin.site.register(Post)'.
Tạo SuperUser và xem trong bảng điều khiển quản trị
Bạn cần tạo SuperUser trước khi truy cập trang 'admin'. Thực hiện bằng 'winpty python manage.py createsuperuser'.





Lưu ý: winpty là lệnh riêng của bash dùng để giao tiếp với các chương trình Console trên Windows.
Chạy máy chủ nền trong bash bằng lệnh python manage.py runserver. Mở trình duyệt và nhập URL sau.
Sau đó điền thông tin của bạn, tức tên người dùng và mật khẩu đã tạo trước đó:
Xem bảng điều khiển quản trị với model 'Post' vừa tạo.
Thay đổi nội dung của 'Post' bằng cách nhấn nút 'Add'. Điền thông tin và 'Save' lại.
Thay đổi trong views và urls
Chuyển đến 'blog/views.py' và chỉnh sửa như bên dưới. Thêm hàm 'blog_list', nhận request. Thực hiện truy vấn để lấy tất cả đối tượng được tạo bằng 'Post.objects.all()' và lưu vào post. Tạo một dictionary mới tên 'context' để truyền đối tượng dưới dạng khóa và lấy trong template 'blog-list.html', thông qua việc trả về phản hồi với render.


Tạo tệp mới tên 'urls.py' trong 'django_blog/blog' và thêm các thay đổi sau. Có import tương đối đến view 'blog_list', đồng thời có 'urlpatterns' là danh sách các đường dẫn đến trang cụ thể trên website. Hiện tại, phần <b'path' chứa chuỗi rỗng và tên của view.
Chuyển đến 'django_blog/urls.py', import include và chỉnh sửa 'urlpatterns'. Thêm đường dẫn đến URLs của app thông qua include. Khi người dùng truy cập 'posts/', họ sẽ được chuyển đến 'blog.urls.'
Tạo và chỉnh sửa Templates
Tạo thư mục templates, nơi lưu các tệp 'HTML' và dùng ngôn ngữ template riêng tên 'Jinja2'. Thư mục cần đặt theo quy ước 'templates/blog/blog_list.html'.





Như bên dưới, có cú pháp liên quan đến 'HyperTextMarkup Language (HTML) với 'h1' cho tiêu đề lớn và danh sách không thứ tự (ul) với phần tử danh sách li. Đồng thời, dùng cú pháp vòng lặp 'for' của 'Jinja 2' để lặp qua đối tượng 'blog_list' được truyền làm khóa từ 'blog/views.py', mỗi phần tử gọi là 'list'.
Xem 'title' có tên 'First Post' trên trang web.
Hãy thêm một mục nữa trong trang quản trị như trên và đặt title cho bài thứ hai là 'Second Post.'
Sau khi thêm và tải lại trang chủ, thông tin sẽ được cập nhật.
Chi tiết cho từng bài viết
Bạn sẽ tạo trang riêng cho từng bài, chứa thông tin về tiêu đề và nội dung của bài đó. 'url' sẽ là "localhost:8000/posts/'id'" trong đó id là số duy nhất hoặc khóa chính gắn với mỗi 'Post' do Django cấp.




Hãy tạo hàm 'blog_detail' trong 'blog/view.py' , nhận id làm tham số. Đồng thời thực hiện truy vấn để lấy đúng id và lưu vào 'each_post'. Tương tự như trên, thông tin cần thiết được truyền làm context đến 'blog_detail.html'.
URL trong 'blog/urls.py' được thay đổi, trong đó path chứa '
<id>' để nhận id duy nhất dạng số nguyên. Giả sử người dùng truy cập 'posts/' sẽ thấy tất cả bài viết, còn khi vào 'posts/1' chỉ thấy thông tin của bài viết đầu tiên.Tạo tệp mới 'blog/blog_detail.html' và thực hiện các thay đổi sau. Vì blog_detail được truyền trong context, 'title' và 'content' có thể truy cập bằng ký pháp dấu chấm.
Mở URL trong trình duyệt và nhập tương tự để xem từng bài viết. Do 'id' của mục đầu tiên là '1', mục thứ hai là '2' và cứ thế cho các mục mới.
Xóa bài viết
Định nghĩa blog_delete, nhận request và id. Thực hiện truy vấn 'Post.objects.get(id=id)' để lấy đối tượng có id duy nhất và lưu vào each_post. Sau đó gọi 'each_post.delete()' để xóa 'Post'. Cuối cùng import HttpResponseRedirect từ module 'django.http' để chuyển hướng trang về '/posts/'




. Trong 'urls.py', import 'blog_delete' và đặt path là '<id>/delete', trong đó id kèm từ delete ở cuối sẽ xóa đối tượng hoặc thông tin tương ứng.
Hãy xóa bài viết bằng cách gõ như sau trong 'urls.py'.
Cuối cùng, trang sẽ được chuyển hướng về '/posts' khi gọi 'posts/1/delete/' trong trường hợp trên trang chủ chỉ có một bài.
Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn! Bạn đã học các kiến thức cơ bản về phát triển Web với Django và hiểu chức năng CRUD. Để biết thêm chi tiết về các chủ đề cụ thể, hãy truy cập Tài liệu Django.
Tài liệu tham khảo: