2012-04-30 20 views
6

Tôi có cấu trúc thư mục sau đây cho các mẫu trên ứng dụng django tôi:Hãy nói django để tìm kiếm mẫu thư mục con ứng dụng của

templates/ 
    app/ 
     model1/ 
     model1_form.html 
     model2/ 
     model2_form.html 

Giả sử tôi đang sử dụng MODEL1 và một ListView chung, ngay bây giờ nó chỉ tìm kiếm qua các mẫu/app/model1_form.html. Có anyway tôi có thể nói với django ông cũng nên tìm kiếm các ứng dụng/thư mục con? Tôi không muốn phải đặt tên mẫu và đường dẫn theo cách thủ công (template_name="templates/app/model1/model1_form.html").

Tại settings.py tôi có:

import os.path 
BASE_PATH = os.path.dirname(os.path.dirname(__file__)) 
TEMPLATE_DIRS = (
    BASE_PATH+'/templates/', 
) 

Đây là quan điểm của tôi:

class HousesListView(ListView): 
    model = House 
    context_object_name = "house_list" 

Cảm ơn trước!

Trả lời

19

Bạn cần thêm django.template.loaders.app_directories.Loader đến TEMPLATE_LOADERS (nếu chưa có).

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
) 

Sau đó, thay đổi cấu trúc thư mục của bạn như vậy mà bạn có một "mẫu" thư mục trong thư mục ứng dụng:

- <project_root> 
    - app 
     - templates 
      - model1 
      - model2 

Hoặc để không gian tên đúng các mô hình để họ không xung đột với tên ứng dụng khác vô tình:

- <project_root> 
    - app 
     - templates 
      - app 
       - model1 
       - model2 
+3

Kiểm tra câu trả lời của Bob Vork cho Django 1.8+ – horriblyUnpythonic

1

Tôi nghĩ rằng để sử dụng các mẫu từ các thư mục con thường bạn có phải:

  1. thủ cho con đường mẫu như subdir/template.html
    ví dụ. render_to_response ('sub/dir/template.html') hoặc TEMPLATE_NAME = '...'

  2. Xác định tất cả các thư mục con trong TEMPLATE_DIRS
    ví dụ.

    TEMPLATE_DIRS = (
    BASE_PATH + '/ templates /',
    BASE_PATH + '/ templates/app',
    BASE_PATH + '/ templates/app/MODEL1',
    )

    Nhưng vì Generic Lần trừ các mẫu được tìm thấy trong app_name/template.html, bạn sẽ phải di chuyển các mẫu của mình để thêm /path/to/templates/app/model1 vào TEMPLATE_DIRS của bạn và di chuyển các mẫu của bạn tới templates/your_app/model/your_app/model_template.html, điều này hơi khó xử.

+0

Tôi đã thử số 2, đặt "mẫu/ứng dụng/model1" tại TEMPLATE_DIR nhưng điều này làm cho tìm kiếm django ở "mẫu/ứng dụng/model1/app/model1_form.html". Ý bạn là gì với số 1? – Clash

+0

@Clash Bạn đã cung cấp đường dẫn tuyệt đối hay tương đối với "mẫu gốc" của bạn? Bởi 1. Tôi có nghĩa là để gọi các mẫu với đường dẫn đầy đủ, mà bạn không muốn làm gì? – varesa

+0

ý của bạn là sử dụng "model/template.html"? – Clash

18

những câu trả lời khác là chính xác tại thời điểm đó, nhưng đối với bất cứ ai đi ngang qua này ngay bây giờ, đây là cách này được thực hiện trong Django 1.8+

Theo mặc định, bây giờ Django sẽ tìm trong các thư mục ứng dụng cho các mẫu.Đây được chỉ định bởi 'APP_DIRS': True, trong bối cảnh TEMPLATES như thế này:

TEMPLATES = [ 
    { 
    ... 
    'DIRS': ['templates'], 
    'APP_DIRS': True, 
    ... 
    }, 
] 

Như câu trả lời khác chỉ ra, bạn vẫn nên sử dụng appname/templates/appname/model1_form.html đến không gian tên các mẫu

(biết thêm: https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-views-that-actually-do-something trong hộp có tiêu đề 'mẫu namespacing ')

Kiểm tra cuối cùng: đảm bảo ứng dụng bạn đang sử dụng nằm trong bộ phận INSTALLED_APPS, vì đó là vấn đề tôi gặp phải.

+0

Thực hiện tốt. "đảm bảo ứng dụng bạn đang sử dụng nằm trong bộ cài đặt INSTALLED_APPS" – Private

0

Với Django 2.0, bạn thậm chí không cần thay đổi bất kỳ thứ gì trong biến số TEMPLATES trong settings.py. Yêu cầu duy nhất là thêm appname.apps.AppnameConfig (ví dụ: catalog.apps.CatalogConfig cho ứng dụng có tên 'danh mục') vào danh sách INSTALLED_APPS, sau đó django sẽ xem dưới tên ứng dụng/mẫu khi tìm kiếm mẫu.

Các vấn đề liên quan