Vị trí tốt nhất để đặt các mẫu trong dự án django là gì?


88

Vị trí tốt nhất để đặt các mẫu trong dự án django là gì?

Câu trả lời:


50

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:

/mediacho tất cả CSS / JS / hình ảnh
/templatescủa tôi, v.v. cho các mẫu của tôi
/projectnamecho mã dự án chính (tức là mã Python)


1
khi bạn đặt mẫu vào / template, có cách nào để yêu cầu trình tải mẫu tải nó mà không chỉ định đường dẫn đầy đủ đến / template trong TEMPLATE_DIRS để tải bằng django.template.loaders.filesystem.Loader không? Nó sẽ là tuyệt vời để làm điều này với một đường dẫn tương đối, và dưới 1,4 loader của tôi là không nhìn dưới <project> / templates
Ciro Santilli郝海东冠状病六四事件法轮功

87

Được đặt trong <PROJECT>/<APP>/templates/<APP>/template.htmlcá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


11
Tự hỏi lý do cho 2 <APP>s trong <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia

18
Đầu tiên / ứng dụng / mẫu chỉ để nhóm các mẫu với ứng dụng có liên quan của chúng. Ứng dụng thứ hai là để ngăn chặn va chạm tên. (Có lẽ, bạn sẽ trỏ TEMPLATE_DIRS để trỏ đến từng thư mục này, nhưng cuối cùng, Django gộp chúng lại với nhau thành một thư mục khổng lồ.) Xem: docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista

3
Đối với điều này để làm việc (django 1.6), tôi đã có thêm chỉ thị cho các tập tin hệ thống mẫu bộ nạp:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
Câu trả lời này là cổ xưa, nhưng bằng cách nào đó tôi đã kết thúc ở đây. Đối với hồ sơ, TEMPLATE_DIRShiệ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/...
John Aaron

9

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.


1
+1 Cảm ơn bạn đã cung cấp thêm chi tiết và dòng ví dụ.
gotgenes

+1 thông minh để đưa /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 csscác tệp vào một thư mục được gọi là static/app/csstương tự cho jsvà có thể jpghoặc chỉ /static/app/images.
hobs

7

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


1

Đâ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.


1

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")
)

1
Các dự án Django có đường dẫn cơ sở của chúng đã được xác định trong settings.py tiêu chuẩn 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')
ngoue

1

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:

  • DIRS xác định danh sách các thư mục nơi công cụ sẽ tìm kiếm các tệp nguồn mẫu, theo thứ tự tìm kiếm.
  • APP_DIRS cho biết liệu công cụ có nên tìm kiếm các mẫu bên trong các ứng dụng đã cài đặt hay không. Mỗi phần phụ trợ xác định một tên thông thường cho thư mục con bên trong các ứng dụng nơi các mẫu của nó sẽ được lưu trữ.

Thông tin thêm: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

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") ]

Hãy xem câu trả lời của tôi. TEMPLATE_DIRShiện không được dùng nữa.
Wilfried

Các dự án Django có đường dẫn cơ sở của chúng đã được xác định trong settings.py tiêu chuẩn 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')
ngoue

0

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.]


Khi nào thì đây là một ý tưởng hay? Không phải nó chậm hơn để tải các mẫu từ DB?
jguffey

Bạn có trở nên phụ thuộc vào db nếu bạn lưu trữ các mẫu trong db plus, bạn sẽ biến db của mình thành một phần của git commit? Bạn sẽ phối hợp như thế nào giữa những thay đổi được thực hiện bởi những người dùng khác nhau trong các mẫu?
gautamaggarwal

Điều này đã được viết theo cách trước khi tôi biết đến git. Thậm chí không chắc chắn tôi đã sử dụng svn vào thời điểm đó. Tôi khuyên bạn nên sử dụng hệ thống kiểm soát phiên bản ngay bây giờ.
TonyM

@tonemcd, kho lưu trữ này đã bị xóa.
lmiguelvargasf 27/07/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.