Vị trí tốt nhất để đặt các mẫu trong dự án django là gì?
Câu trả lời:
Từ cuốn sách Django, chương 4 :
Nếu bạn không thể nghĩ ra một nơi rõ ràng để đặt các mẫu của mình, chúng tôi khuyên bạn nên tạo một thư mục mẫu trong dự án Django của mình (tức là trong thư mục mysite bạn đã tạo trong Chương 2, nếu bạn đang theo dõi cùng với các ví dụ của chúng tôi).
Đây chính xác là những gì tôi làm, và đã mang lại hiệu quả tuyệt vời cho tôi.
Cấu trúc thư mục của tôi trông giống như sau:
/media
cho tất cả CSS / JS / hình ảnh
/templates
của tôi, v.v. cho các mẫu của tôi
/projectname
cho mã dự án chính (tức là mã Python)
Được đặt trong <PROJECT>/<APP>/templates/<APP>/template.html
các mẫu dành riêng cho ứng dụng để giúp làm cho ứng dụng có thể tái sử dụng ở nơi khác.
Đối với các mẫu "toàn cầu" chung, tôi đã đưa chúng vào <PROJECT>/templates/template.html
<APP>
s trong <PROJECT>/<APP>/templates/<APP>/template.html
?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
hiện đang bị phản đối - thay vào đó bạn nên thêm DIRS=[os.path.join(BASE_DIR, "templates")]
vào TEMPLATES
- xem stackoverflow.com/questions/29725132/...
Theo dõi từ Dominic và dlrust,
Chúng tôi sử dụng phân phối nguồn setuptools (sdist) để đóng gói dự án django và các ứng dụng để triển khai trong các môi trường khác nhau của chúng tôi.
Chúng tôi nhận thấy rằng các mẫu và tệp tĩnh cần phải nằm trong thư mục ứng dụng django để chúng có thể được đóng gói bằng các công cụ cài đặt.
Ví dụ: mẫu và đường dẫn tĩnh của chúng tôi trông giống như:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Để điều này hoạt động, MANIFEST.in cần được sửa đổi (xem http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )
Ví dụ về MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Ngoài ra, bạn cần xác nhận trong tệp cài đặt django của mình rằng trình tải app_directories nằm trong TEMPLATE_LOADERS của bạn. Tôi nghĩ nó ở đó theo mặc định trong django 1.4.
Ví dụ về trình tải mẫu cài đặt django:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
Chỉ trong trường hợp bạn đang thắc mắc tại sao chúng tôi sử dụng sdists thay vì chỉ sao chép các tệp rsync; đó là một phần của quy trình quản lý cấu hình của chúng tôi, nơi chúng tôi có một tarball xây dựng duy nhất được triển khai với PIP không thay đổi trong môi trường thử nghiệm, chấp nhận và sản xuất.
/static/
vào sơ đồ bố cục của bạn khi nghĩ về các mẫu và ứng dụng mô-đun. Bạn có thể muốn đề cập đến một phương pháp hay nhất khác, đặt css
các tệp vào một thư mục được gọi là static/app/css
tương tự cho js
và có thể jpg
hoặc chỉ /static/app/images
.
DJANGO 1.11
thêm thư mục mẫu, nơi quản lý.py tồn tại, là thư mục cơ sở của bạn. thay đổi DIRS cho TEMPLATES như sau trong cài đặt của bạn.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Bây giờ để sử dụng mẫu bằng cách sử dụng mã,
def home(request):
return render(request,"index.html",{})
trong views.py. cái này hoạt động hoàn toàn tốt cho django 1.11
Đây là một lựa chọn cá nhân hơn ở cấp độ dự án. Nếu bạn đang nói về các ứng dụng cần phải có thể cắm được, thì thư mục mẫu trong ứng dụng của bạn là nơi đặt chúng mặc định. Nhưng trên toàn dự án, nó là thứ phù hợp nhất với bạn.
Tôi hiểu TEMPLATE_DIRS
đòi hỏi một con đường tuyệt đối. Và tôi không thích các đường dẫn tuyệt đối trong mã của mình. Vì vậy, điều này đang hoạt động tốt cho tôi, trong settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR
, vì vậy bạn có thể đơn giản hóa điều này thành:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS
không được dùng nữa.
Bây giờ chúng ta cần sử dụng TEMPLATE
, giới thiệu trong Django 1.8 như thế này:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Khi bạn đã xác định TEMPLATES, bạn có thể xóa ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS và TEMPLATE_STRING_IF_INVALID một cách an toàn.
Về vị trí tốt nhất, Django đang tìm kiếm mẫu như thế này:
Thông tin thêm: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
Giải pháp trước đó không hoạt động trong trường hợp của tôi. Tôi đã sử dụng:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRS
hiện không được dùng nữa.
BASE_DIR
, vì vậy bạn có thể đơn giản hóa điều này thành:os.path.join(BASE_DIR, '../myapp/templates')
Bạn cũng có thể cân nhắc việc đưa các mẫu của mình vào cơ sở dữ liệu, sử dụng django-dbtemplates . Nó cũng được thiết lập để lưu vào bộ nhớ đệm và ứng dụng django-reverseion giúp bạn lưu giữ các phiên bản cũ của mẫu.
Nó hoạt động khá tốt, nhưng tôi muốn linh hoạt hơn một chút ở phía nhập / đồng bộ đến / từ hệ thống tệp.
[chỉnh sửa: 20 tháng 8 năm 2018 - kho lưu trữ này không có sẵn, một kho lưu trữ có cùng tên hiện có tại https://github.com/jazzband/django-dbtemplates và đã được cập nhật 8 tháng trước. Tôi không còn sử dụng Django theo bất kỳ cách nào có ý nghĩa, vì vậy không thể đảm bảo cho điều này.]