DJANGO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Django Edit Form trong Python

Django, một framework mạnh mẽ và phổ biến dựa trên Python, cung cấp cho các lập trình viên những công cụ cần thiết để nhanh chóng tạo ra các ứng dụng web mạnh mẽ và bảo mật. Một trong những tính năng quan trọng của Django là khả năng xử lý form – đặc biệt là các form chỉnh sửa (Edit Form), giúp người dùng dễ dàng cập nhật và quản lý dữ liệu.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong bài viết này, mình sẽ cùng tìm hiểu chi tiết các bước để thiết lập một Edit Form trong Django, từ việc tạo model, xây dựng form, thiết lập view, đến việc tạo template và định tuyến URL. Qua đó, bạn sẽ có cái nhìn rõ ràng và cụ thể hơn về quy trình phát triển và tích hợp một Edit Form vào dự án Django của mình.

Thiết lập môi trường Django trong Python

Trong phần này, chúng ta sẽ tạo môi trường phát triển cho dự án Django bằng cách cài đặt Django và tạo dự án mới. Sau đó, chúng ta sẽ tìm hiểu về cấu trúc thư mục và các tệp tin cơ bản của dự án Django.

Cài đặt Django

Bài viết này được đăng tại [free tuts .net]

Để cài đặt Django, mình sử dụng công cụ quản lý gói pip của Python. Mở terminal và chạy lệnh sau:

pip install django

Thiết lập dự án

Sau khi cài đặt Django, mình sẽ tạo một dự án Django mới bằng lệnh sau:

django-admin startproject ten_du_an

Để tạo một ứng dụng mới trong dự án, chúng ta sử dụng lệnh sau:

cd ten_du_an
python manage.py startapp ten_ung_dung

Cấu trúc dự án Django

Cấu trúc thư mục của dự án Django bao gồm các phần sau:

ten_du_an/: Thư mục gốc của dự án.

  • init.py: File rỗng, chỉ định thư mục này là một gói Python.
  • settings.py: Cấu hình dự án Django như cài đặt cơ sở dữ liệu, cài đặt ứng dụng, v.v.
  • urls.py: Cấu hình các định tuyến URL của dự án.
  • wsgi.py: File cung cấp điểm giao tiếp giữa máy chủ web và ứng dụng web.
  • asgi.py: File cung cấp giao tiếp giữa máy chủ web và ứng dụng web sử dụng ASGI (Asynchronous Server Gateway Interface).

ten_ung_dung/: Thư mục của ứng dụng.

  • migrations/: Chứa các file migrations để quản lý cấu trúc cơ sở dữ liệu.
  • init.py: File rỗng, chỉ định thư mục này là một gói Python.
  • admin.py: Cấu hình giao diện quản trị Django.
  • apps.py: Cấu hình ứng dụng Django.
  • models.py: Định nghĩa các model dữ liệu.
  • tests.py: Viết các test cho ứng dụng.
  • views.py: Xử lý logic điều khiển và trả về dữ liệu.

Screenshot 202024 05 21 20162613 png

Trong phần này, mình đã tạo môi trường phát triển cho dự án Django bằng cách cài đặt Django và tạo dự án mới. Sau đó, chúng ta đã tìm hiểu về cấu trúc thư mục và các tệp tin cơ bản của dự án Django. Điều này sẽ giúp hiểu rõ hơn về cách tổ chức dự án và làm việc với nó trong quá trình phát triển.

Tạo một URL Pattern Django trong Python

Đầu tiên, tạo một URL pattern cho việc chỉnh sửa một bài đăng:

from django.urls import path
from . import views
#Bài viết này được đăng tại freetuts.net

urlpatterns = [
    path('', views.home, name='posts'),
    path('post/create', views.create_post, name='post-create'),
    path('post/edit/<int:id>/', views.edit_post, name='post-edit'),
    path('about/', views.about, name='about'),
]

URL chỉnh sửa bài đăng chấp nhận một id dưới dạng số nguyên được chỉ định bởi mẫu <int:id>. Ví dụ, nếu bạn chỉnh sửa bài đăng với id 1, URL sẽ là:

http://127.0.0.1/post/update/1/

Django sẽ truyền id (1) vào đối số thứ hai cho hàm edit_post().

Nếu bạn truyền một giá trị không phải là số nguyên vào URL như sau:

http://127.0.0.1/post/update/abcd/

Django sẽ chuyển hướng đến trang 404 vì nó không khớp với bất kỳ URL nào trong các mẫu URL.

Khai báo View Django trong Python

Định nghĩa hàm edit_post() trong file views.py:

from django.shortcuts import render,redirect, get_object_or_404
from django.contrib import messages
from .models import Post
from .forms import PostForm
#Bài viết này được đăng tại freetuts.net

def edit_post(request, id):
    post = get_object_or_404(Post, id=id)

    if request.method == 'GET':
        context = {'form': PostForm(instance=post), 'id': id}
        return render(request,'blog/post_form.html',context)

Đầu tiên, import hàm get_object_or_404 từ module django.shortcuts:

from django.shortcuts import render,redirect, get_object_or_404

Hàm get_object_or_404() lấy một đối tượng theo id hoặc chuyển hướng đến trang 404 nếu id không tồn tại.

  • Thứ hai, định nghĩa hàm edit_post() nhận một đối tượng HttpRequest (request) và một id dưới dạng số nguyên.

Hàm edit_post() thực hiện các bước sau:

- Lấy một đối tượng Bài đăng theo id hoặc chuyển hướng đến trang 404 nếu id không tồn tại.
- Tạo một đối tượng `PostForm` và thiết lập đối số instance là đối tượng bài đăng.
- Render template `post_form.html`.

Tạo một Template Django trong Python

Tạo template post_form.html trong thư mục templates/blog của ứng dụng blog:

{% extends 'base.html' %}
	
{% block content %}
#Bài viết này được đăng tại freetuts.net

<h2>{% if id %} Chỉnh Sửa {% else %} Bài Đăng Mới {% endif %}</h2>
<form method="post" novalidate>
	{% csrf_token %}
	{{ form.as_p }}
	<input type="submit" value="Lưu" />
</form>

{% endblock content %}

Template này chứa một biểu mẫu có tiêu đề tương ứng với trạng thái chỉnh sửa hoặc tạo mới. Nếu id (id của bài đăng) có sẵn, thì biểu mẫu đang ở chế độ chỉnh sửa. Ngược lại, nó ở chế độ tạo mới. Dựa trên logic này, chúng ta thay đổi tiêu đề của biểu mẫu tương ứng.

Thêm liên kết chỉnh sửa

Thêm liên kết chỉnh sửa cho mỗi bài đăng trong template home.html:

{% extends 'base.html' %}
#Bài viết này được đăng tại freetuts.net
	
{% block content %}
<h1>Bài Đăng Của Tôi</h1>
	{% for post in posts %}
		<h2>{{ post.title }}</h2>
		<small>Xuất bản vào {{ post.published_at | date:"M d, Y" }} bởi {{ post.author | title}}</small>
		<p>{{ post.content }}</p>
		<p><a href="{% url 'post-edit' post.id %}">Chỉnh Sửa</a></p>
	{% endfor %}
{% endblock content %}

Nếu bạn mở URL http://127.0.0.1/, bạn sẽ thấy một danh sách các bài đăng với liên kết chỉnh sửa kèm theo mỗi bài đăng, như được hiển thị trong hình ảnh dưới đây:

Screenshot 202024 05 21 20162158 png

Nếu bạn nhấp vào liên kết Chỉnh Sửa để chỉnh sửa một bài đăng, bạn sẽ thấy một biểu mẫu được điền sẵn với các giá trị trường. Ví dụ, bạn có thể chỉnh sửa bài đăng "Flat is better than nested", bạn sẽ thấy biểu mẫu sau:

Screenshot 202024 05 21 20162217 png

Để chỉnh sửa bài đăng, bạn thay đổi các giá trị và nhấp vào nút Lưu. Tuy nhiên, chúng ta chưa thêm mã xử lý yêu cầu HTTP POST (khi nhấn nút Lưu) vào.

Thêm xử lý yêu cầu POST Django trong Python

Thêm mã xử lý yêu cầu HTTP POST, tức là khi nhấn vào nút Lưu:

def edit_post(request, id):
    post = get_object_or_404(Post, id=id)

    if request.method == 'GET':
        context = {'form': PostForm(instance=post), 'id': id}
        return render(request,'blog/post_form.html',context)
    #Bài viết này được đăng tại freetuts.net
    elif request.method == 'POST':
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            messages.success(request, 'Bài đăng đã được cập nhật thành công.')
            return redirect('posts')
        else:
            messages.error(request, 'Vui lòng sửa các lỗi sau:')
            return render(request,'blog/post_form.html',{'form':form})

Cập nhật bài đăng bằng cách thêm ba dấu hoa thị (***) vào tiêu đề, sau đó nhấp vào nút Lưu, bạn sẽ thấy bài đăng đã được cập nhật:

Screenshot 202024 05 21 20162252 png

Bằng cách này, bạn đã hoàn thành bài hướng dẫn về cách tạo một biểu mẫu chỉnh sửa trong Django để cập nhật một bài đăng.

Screenshot 202024 05 21 20162433 png

Kết bài

Trong bài viết này, mình đã tìm hiểu quy trình tạo một Edit Form trong Django bằng Python. Mình đã bắt đầu với việc thiết lập môi trường phát triển bằng cách cài đặt Django và tạo dự án mới. Tiếp theo, ta đã tạo một Model để định nghĩa cấu trúc dữ liệu của ứng dụng và chạy migrations để áp dụng cấu trúc cơ sở dữ liệu.

Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về cách tạo và tích hợp một Edit Form trong Django, và bạn có thể áp dụng kiến thức này vào các dự án thực tế của mình.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top