Hiển thị thông tin bài viết trong Python Django

Lập trình web với Python bằng Django

0.0 (0 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 17:53 23-11-2019 9.989 lượt xem 3 bình luận
Học nhanh

Danh sách bài học

Hiển thị thông tin bài viết trong Python Django

Ghi chú

Nội dung bài viết bạn đang xem được update từ tháng 06/2019. Vì vậy sẽ có đôi chút khác biệt giữ VIDEO và NỘI DUNG BÀI VIẾT.

Chúng ta sẽ có nhiều cập nhập hơn về cả bài viết lẫn video trong thời gian tới. Nhớ like/ share hoặc đánh giá 5 sao để Kteam có động lực nhé! 

Cảm ơn các bạn! 


Dẫn nhập

Ở bài trước, chúng ta đã LIỆT KÊ DANH SÁCH BÀI VIẾT TRONG PYTHON DJANGO. Trong bài này, Kteam sẽ hướng dẫn cho các bạn biết cách hiển thị chi tiết một bài viết khi người dùng yêu cầu.


Nội dung

Để theo dõi bài này tốt nhất, bạn nên xem qua bài:

Bài này sẽ giới thiệu những nội dung sau:

  • Tạo url để hiển thị bài viết thông qua id
  • Xử lý lấy thông tin bài viết
  • Viết testcase

Tạo url để hiển thị bài viết thông qua id

Ở bài học trước, Kteam đã tạo đường dẫn url như sau:

<h4>{{post.date|date:"d-m-Y"}}<a href="/redirect?Id=XFWwRhLp0mSTd9Wax7NavaaW0OFX0hlzgKM0xKlFX3onFFgtYh6qHM4KXsj1G05uFTfbrCkJYatYZfahoYcjPq6IfX4AE2Sjw%2bDfPpwc7RNUD%2b1XydoBnFo%2bIrY52f6Q"

Khi render thì sẽ tạo đường link như thế này:

Như vậy, mục đích của Kteam là tạo đường dẫn /blog/id để dựa vào id mà hiện thị đúng chi tiết bài viết. Ở file urls.py của app blog cần khai báo path đó như sau:

urlpatterns = [
   path('', views.list),
   path('<int:id>/', views.post),
]

id của bài viết là linh động, mình phải khai báo theo cú pháp <kiểu dữ liệu:keyword>. Tiếp theo, Kteam sẽ viết hàm post ở views để xử lý thông tin bài viết.


Xử lý lấy thông tin bài viết

Bây giờ, ta sẽ viết hàm post để xử lý path trên:

def post(request, id):
    post = Post.objects.get(id=id)
    return render(request, 'blog/post.html', {'post': post})

Ở hàm post, ngoài tham số request, ta còn thêm tham số id tương ứng keyword id ở path. Sau đó, ta sẽ truy vấn bài viết bằng id trên. Rồi đưa bài viết vào render, bây giờ kteam sẽ thiết kế template post.html.

{% extends "pages/base.html" %}
 
{% block title %}{{post.title}}{% endblock %}
 
{% block content %}
<h3><a href="/redirect?Id=duECimTrtcY%2f9%2fkQF45R8ricuL8rnN1W89bqLQLRmAR%2b2AE1Wuc2%2fsatIaeyTQ2SiSNKPWJ7vem62cw9ZxE2LzZQEtuy6DuaTgL6aoimSYA%3d"
<h6>on {{post.date}}</h6>
{{post.body|safe|linebreaks}}
{% endblock %}
  • Ở block title ta sẽ thấy tiêu đề của bài viết đưa vào.
  • Hiển thị rõ tiêu đề bài viết lớn trong tag <h3>.
  • Hiển thị ngày viết bài trong tag <h6>.
  • Hiển thị nội dung bài viết, ta thêm safe để có thể render nếu trong body có thẻ html và linebreaks để chuyển các ký tự enter (\n) sang tag <br/>.

Bây giờ ta kiểm tra kết quả, vào phần các bài viết và click tiêu đề:

Như vậy ở url /blog/1 đã hiển thị ra bài viết có id bằng 1. Giờ ta thử quay về Admin chỉnh sửa lại bài viết này

Nếu ta cho tag <h1> thì safe sẽ render đúng chức năng của html của nó

Giờ ta thử xóa safe sẽ ra kết quả nguyên bản

Nếu ta thử xuống dòng ở phần body như sau

Vì ở máy tính thì xuống dòng là kí hiệu \n, nhưng ở html không hiểu kí hiệu này nên linebreaks có chức năng chuyển sang thẻ <br/> để đúng cách chia bố cục của bài viết.


Viết testcase

Bây giờ, Kteam sẽ viết 1 số test case để kiểm tra code mình đã viết vừa rồi, ta sẽ mở file tests.py để xử lý:

from django.test import TestCase
from .models import Post
# Create your tests here.
class BlogTests(TestCase):
    def setUp(self):
        Post.objects.create(
            title='myTitle',
            body='just a Test'
        )

    def test_string_representation(self):
        post = Post(title='My entry title')
        self.assertEqual(str(post), post.title)

    def test_post_list_view(self):
        response = self.client.get('/blog/')
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'myTitle')
        self.assertTemplateUsed(response, 'blog/blog.html')

    def test_post_detail_view(self):
        response = self.client.get('/blog/1/')
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'myTitle')
        self.assertTemplateUsed(response, 'blog/post.html')
  • Phương thức setUp đầu tiên là tạo 1 bài viết trong hệ thống test, bài viết được tạo ở đây sẽ không ảnh hưởng gì đến database đang làm.
  • Phương thức test_string_representation nhằm để kiểm tra phương thức __str__ của Post có ra giá trị title không. Kteam tạo ra 1 post và so sánh hai giá trị dùng hàm gán str() và gọi tiêu đề title ra.
  • Phương thức test_post_list_view kiểm tra chức năng hiển thị danh sách bài viết, bằng cách vào đường dẫn /blog/ kiểm tra status code có trả về 200 không? Trong response có tiêu đề bài viết không? Có sử dụng template blog.html như đã làm không.
  • Phương thức test_post_detail_view kiểm tra chức năng hiển thị thông tin bài viết, cách kiểm tra cũng tương tự hiển thị danh sách bài viết.

Kết

Như vậy Kteam đã hướng dẫn các bạn xong cách hiển thị thông tin bài viết trong Python Django.

Ở bài tiếp theo, Kteam sẽ giới thiệu cho các bạn LOẠI BỎ HARDCODED URL TRONG PYTHON DJANGO.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Khóa học

Lập trình web với Python bằng Django

Lập trình web với Python bằng Django

Đánh giá

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
vt.dat2708 đã bình luận 19:07 13-03-2018



Chào ad!
Hiện giờ em muốn truyền cho render 2 cái dữ liệu trong 2 bảng khác nhau thì phải làm sao?
Em đã thử truyền 2 data bằng cách thêm vào render ở cuối nhưng không được!!!
Em xin cảm ơn ạ!

Không có video.