2009-05-21 24 views
25

Second time hỏi thêm chi tiết ...Django - Làm thế nào để có một dự án templatetags rộng chia sẻ giữa tất cả các ứng dụng của tôi trong dự án mà

Tôi muốn có một thư mục templagetags rộng dự án để có chung thẻ được sử dụng bởi tất cả ứng dụng, sau đó mỗi ứng dụng có thể có thẻ của riêng mình nếu cần.

Hãy nói rằng tôi có:

proj1/app1 
proj1/app1/templatetags/app1_tags.py 

proj1/app2 
proj1/app2/templatetags/app2_tags.py 

proj1/templatetags/proj1_tags.py 

proj1/templates/app1/base.html 
proj1/templates/app1/index.html 
proj1/templates/app2/base.html 
proj1/templates/app2/index.html 

đâu:

proj1/templates/app1/base.html 
----------- 
{% load proj1_tags %} 
{% load app1_tags %} 

proj1/templates/app1/index.html 
----------- 
{% extends "base.html" %} 

proj1/templates/app2/base.html 
----------- 
{% load proj2_tags %} 
{% load app2_tags %} 

proj1/templates/app2/index.html 
----------- 
{% extends "base.html" %} 

Sẽ làm việc này? Nó không hiệu quả với tôi. Nó không thể tìm thấy các proj1_tags để tải.

Trả lời

36

Tôi không biết nếu điều này là đúng cách để làm điều đó, nhưng trong các ứng dụng Django của tôi, tôi luôn luôn đặt mẫu thẻ chung trong một "ứng dụng" lib, như vậy:

proj/ 
    __init__.py 
    lib/ 
     __init__.py 
     templatetags/ 
      __init__.py 
      common_tags.py 

Chỉ cần đảm bảo thêm ứng dụng lib vào danh sách INSTALLED_APPS của bạn trong settings.py.

+2

Tôi thường đặt tên cho ứng dụng sau khi dự án: "project_core" - nhưng cùng một giải pháp. –

+3

'common' hoặc' commons' có thể là một tên tốt. –

+0

cách bạn gọi nó trong tệp html? Chỉ cần '{% load common_tags%}'? – andi

3

Django đăng ký templatetags toàn cầu cho từng ứng dụng trong INSTALLED_APPS (và đó là lý do giải pháp của bạn không hoạt động: dự án không phải là một ứng dụng theo cách hiểu của Django) — họ có sẵn trong tất cả các mẫu (cung cấp họ đã được đăng ký đúng cách).

Tôi thường có ứng dụng xử lý chức năng linh tinh (như trang bắt đầu của trang web) và đặt templatetags không liên quan đến bất kỳ ứng dụng cụ thể nào, nhưng điều này hoàn toàn là mỹ phẩm.

0

Django hoạt động theo Ứng dụng. Chúng được tham chiếu trong cài đặt INSTALLED_APPS.

Tôi khuyên bạn nên chia mọi thứ liên quan đến một ứng dụng khác. Đối với vấn đề templatetags của bạn, bạn có thể tạo một ứng dụng gọi là 'common_tags'. Sau đó thiết lập các thiết lập INSTALLED_APPS để sử dụng nó, và bạn sẽ có thể nạp thẻ thông thường của bạn từ bất kỳ mẫu như vậy:

{% load XXXX %} 
9

Kể từ Django 1.9, nó không còn cần thiết để tạo thêm ứng dụng common như những người khác đề cập . Tất cả những gì bạn cần làm là thêm đường dẫn vào thư mục dự án templatetags của bạn vào số OPTION['libraries'] dict của settings.py.

Sau đó, các thẻ này sẽ có thể truy cập được trong toàn bộ dự án của bạn. Thư mục templatetags có thể được đặt bất cứ nơi nào bạn cần và cũng có thể có tên khác.

dụ Customized từ Django docs:

OPTIONS={ 
    'libraries': { 
     'myapp_tags': 'path.to.myapp.tags', 
     'project_tags': 'project.templatetags.common_extras', 
     'admin.urls': 'django.contrib.admin.templatetags.admin_urls', 
    }, 
} 
+1

Chỉ cần làm cho nó rõ ràng hơn, trong mẫu html, nơi thẻ này được gọi là một nhu cầu '{% load project_tags%}' trước khi gọi thẻ thông thường bằng cách sử dụng '{% common_extras%}'. – h4k1m

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