Django – App, URL and Template

Hé lô mọi người, ở số này hãy cùng Django-er tìm hiểu về Apps , URLs và Templates trong Django Framework nhé 😃

Apps

  • Mọi app mà bạn viết bằng Django đều sẽ được xem là một Python package. Và Django có sẵn công cụ để tạo structure căn bản cho một app.
  • Một app sẽ chỉ thực hiện một chức năng nhất định, ví dụ như hiển thị bài viết, quản lý user, hay tạo ứng dụng bình chọn v.v… Và một Project sẽ chứa các app đó, tạo thành một website. Và một app cũng có thể dùng trong nhiều Project khác nhau

Giả sử chúng ta đang có project tên là mysite với cấu trúc thư mục như sau :

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

Giờ chúng ta sẽ tạo 1 app với terminal như sau :

python manage.py startapp polls

Thử xem cấu trúc thự mục mới chúng ta vừa tạo như thế nào nhé

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

admin.py: Chứa các thông tin liên quan đến việc triển khai module admin cho website.
apps.py: Nơi chứa các config của app.
models.py: Nơi chứa các khai báo đối tượng trong database của app
tests.py: Chứa các test case đùng để thực hiện unit-test.
views.py:  Lớp này chứa các logic để truy cập dữ liệu qua Model và truyền nó ra ngoài cho Template tương ứng.

Và bây giờ ta sẽ khai báo cho project biết ta vừa tạo 1 App mới (mục đích chính là nếu sau này App có liên quan trong việc thiết kế các bảng trong database).

Ta vào mục PythonWeb, mở file settings.py. Ở phần khai báo INSTALLED_APPS, tao ghi thêm tên App vào trong:

INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

Để cập nhật cho phần settings ta sẽ chạy lệnh sau :

python manage.py migrate

URLs

Giả sử chúng ta đang có 1 view polls/views.py như sau :

from django.http import HttpResponse
 
def index(request):
    response = HttpResponse()
    response.write("<h1>Welcome</h1>")
    response.write("This is the polls app")
    return response

Để gọi được tới hàm index này và lấy nội dung HTML thì chúng ta phải tạo đường dẫn URL tới file này.

Để tạo URL chúng ta tạo một file với tên urls.py bên trong thư mục polls.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

Bên trong file urls.py chúng ta khai báo một đối tượng List có tên urlpatterns, Django sẽ tìm thông tin về các url trong list này, list này chứa các đối tượng url, mỗi url bao gồm 3 tham số, tham số thứ nhất là  một chuỗi có chứa mẫu URL, tham số thứ hai là tên module và tên hàm sẽ trả về nội dung HTML, ở đây là hàm index trong module views (file views.py), tham số thứ 3 là tên biến toàn cục trong toàn bộ ứng dụng, trong đó 2 tham số đầu tiên là bắt buộc phải có.

Sau khi đã có đường dẫn cho riêng polls, thì tiếp theo chúng ta phải tạo đường dẫn đến ứng dụng pollnày nữa, chúng ta sẽ tạo đường dẫn cho từng ứng dụng trong file mysite/urls.py

from django.conf.urls import include, url
from django.contrib import admin 
 
urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

Bên trong file mysite/urls.py cũng có một list urlpatterns, list này chứa các đối tượng url dẫn đến các ứng dụng web khác mà chúng ta viết

Function include() cho phép sử dụng các URLconf của các app con nhưng riêng admin.site.urls thì không cần.

Templates

Giới thiệu

Như chúng ta đã biết trình duyệt chỉ hiểu mã HTML chứ không hiểu code Python, vì vậy để có thể sử dụng code Python thì Django cung cấp cho chúng ta Templates với mục đích là để hỗ trợ hiển thị dữ liệu.

Cùng làm việc với Template nào 😁

  • Django cung cấp cho chúng ta các thẻ template bắt đầu và kết thúc bằng cặp kí tự {% %} hoặc {{ } Các câu lệnh Python sẽ nằm trong cặp dấu {% %}, còn các biến thì nằm trong cặp {{ }}.

VD :

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
  • Bộ lọc – Filter: Django cung cấp các bộ lọc để hỗ trợ chúng ta hiển thị dữ liệu theo nhiều cách khác nhau.
  • VD : {{ name|lower }}, trong đó lower là một bộ lọc, có tác dụng chuyển toàn bộ chữ cái thành chữ thường. Để dùng các bộ lọc thì chúng ta kèm theo dấu | và tên bộ lọc vào sau tên biến
  • Thẻ tag
  • Thẻ tag có cú pháp {% tag %} , thường dùng thực hiện các luồng điều khiển hoặc load các thông tin khác vào template. Có một số thẻ đi kèm với cả thẻ kết thúc nữa {% tag %} thì sẽ có {% endtag %}.
{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

Trong đoạn code trên, nếu athlete_list không rỗng thì in ra biến athlete_list, ngược lại thì kiểm tra nếu athlete_in_locker_room_list không rỗng thì in ra đoạn text “Athletes should…”, còn nếu không thì in ra đoạn text “No athletes.”

  • Thừa kế template :
  • Tính năng mạnh mẽ nhất và cũng là phức tạp nhất của Template trong Django là tính năng thừa kế. Tính năng thừa kế cho phép bạn xây dựng một bộ template tổng quát và các template con, trong đó template tổng quát sẽ chứa các template con.
  • VD template cha base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>
 
<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>
 
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
  • Ví dụ về một template con
{% extends "base.html" %}
 
{% block title %}My amazing blog{% endblock %}
 
{% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        {{ entry.body }}
    {% endfor %}
{% endblock %}
  • Để một template con có thể override lại các thẻ block của template khác thì ở đầu template chúng ta khai báo thẻ extends với tên file template. Trong ví dụ trên, trình biên dịch Django sẽ đọc trong template cha và thấy các thẻ block trong template cha cũng có trong template con nên phần block trong template con sẽ được chèn vào trong template cha.
  • note : Thẻ block trong template con cũng có thể dùng lại nội dung của template cha, chỉ cần gọi {{block.super}}

LỜI KẾT

Như vậy là chúng mình đã cùng nhau tìm hiểu những kiến thức cơ bản về Apps, URLs và Templates trong Django rồi .Rất mong nhận được những ý kiến đóng góp của mọi người. Thân ái !

Add a Comment