2012-02-16 35 views
17

Giả sử tôi có một dự án Django với ba ứng dụng: foo, bar và keo. Tôi đang cố gắng làm theo các quy ước ứng dụng có thể tái sử dụng, vì vậy foo và bar không phụ thuộc vào (và không biết gì về) lẫn nhau hoặc trên keo. Keo chứa mã để tích hợp hai ứng dụng khác vào trang web.Django: Làm cách nào để ghi đè url do ứng dụng cung cấp trong urlconf dự án của tôi?

Foo cung cấp thẻ mẫu mà tôi muốn đưa vào một trong các trang do thanh cung cấp. Chế độ xem cho trang của thanh có thể được chuyển qua một mẫu thay thế. Tôi làm cho một mẫu trong keo kéo dài mẫu của thanh và bao gồm thẻ mẫu từ foo. Để chuyển mẫu mới của tôi vào chế độ xem của thanh, tôi cần phải sửa đổi mục nhập urlconf trỏ đến nó.

Dự án của tôi URLconf trông giống như sau:

urlpatterns = patterns('', 
    (r'^$', include('glue.urls')), 
    (r'^foo/', include('foo.urls')), 
    (r'^bar/', include('bar.urls')), 
) 

cách thanh lịch nhất để vượt qua các mẫu thay thế là gì (hoặc bất kỳ đối số quan điểm khác tùy ý, cho rằng vấn đề) để xem trong thanh? Tôi không muốn sửa đổi url của thanh trực tiếp, vì điều đó sẽ làm cho nó phụ thuộc vào keo.

Phương pháp duy nhất tôi có thể nghĩ là xóa include('bar.urls'), sao chép mẫu url trong urlconf của thanh vào url dự án và sửa đổi mẫu mà tôi quan tâm. Phương pháp đó vi phạm nguyên tắc DRY. Có một số giải pháp khác mà tôi đang thiếu?

Trả lời

23

Rõ ràng URL trùng lặp được phép vào URLconf, và trận đấu đầu tiên niêm yết sẽ được ưu tiên:

urlpatterns = patterns('', 
    (r'^$', include('glue.urls')), 
    (r'^foo/', include('foo.urls')), 

    # This will override the same URL in bar's urlconf: 
    (r'^bar/stuff/$', 'glue.views.new_bar_stuff', {'arg': 'yarrgh'}, 'bar_stuff'), 

    (r'^bar/', include('bar.urls')), 
) 
2

Nó không phải là rõ ràng những gì bạn đang yêu cầu, nhưng như tôi hiểu nó, câu hỏi của bạn là:

cách thanh lịch nhất để vượt qua các mẫu thay thế cho quan điểm trong thanh là gì?

Điều này không liên quan gì đến url của url, chỉ ánh xạ URL tới phương thức.

Mẫu trong django được tra cứu từ các vị trí trong TEMPLATE_DIRS trong settings.py của bạn và quan trọng nhất là django sẽ ngừng tìm khi mẫu tìm thấy mẫu.

Nếu TEMPLATE_DIRS của bạn trống (như mặc định), sau đó django sẽ tìm mẫu trong thư mục templates bên trong mọi ứng dụng đã đăng ký (ứng dụng được liệt kê trong INSTALLED_APPS).

Vì vậy, để chuyển mẫu thay thế cho bất kỳ ứng dụng nào, chỉ cần tạo một tệp có cùng tên (và cấu trúc thư mục) trong một thư mục được liệt kê trong TEMPLATE_DIRS. Django sẽ tìm kiếm đầu tiên này và dừng lại khi tìm thấy kết quả phù hợp.

Đây cũng giống như cách bạn ghi đè mẫu quản trị viên mặc định.

Đối với trường hợp cụ thể của bạn, giả sử bạn muốn chuyển phiên bản thay thế index.html cho ứng dụng bar.

Tạo thư mục override_templates ở đâu đó trong đường dẫn dự án của bạn.

Bên trong tạo thư mục bar/templates/ và thêm index.html được tùy chỉnh của bạn vào thư mục này, vì vậy bạn có override_templates/bar/templates/index.html.

Thêm đường dẫn đầy đủ vào override_templates đến TEMPLATE_DIRS trong settings.py.

Bây giờ, django sẽ tìm kiếm thư mục tùy chỉnh của bạn trước tiên cho bất kỳ mẫu nào được yêu cầu và sẽ tải index.html thay thế của bạn.

+2

tôi sẽ xem xét cách tiếp cận này, nhưng nó không hoàn toàn những gì tôi đang tìm kiếm. Điều gì sẽ xảy ra nếu tôi muốn vượt qua một số đối số khác để xem? Khung nhìn được gọi trong urlconf, do đó có vẻ như là nơi hợp lý để chuyển đối số. –

+0

Bạn muốn chuyển đối số tùy ý cho chế độ xem? Làm rõ câu hỏi của bạn. –

+1

Có, tương tự với các đối số mà bạn muốn chuyển sang chế độ xem chung từ urlconf. –

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