2009-08-12 25 views
11

Tôi thấy ngôn ngữ mẫu của django rất hạn chế. Sau cùng với nguyên tắc DRY của django, tôi có một mẫu mà tôi muốn sử dụng trong nhiều mẫu khác. Ví dụ một danh sách bệnh nhân:Sử dụng lại các mẫu django?

{% for physician in physicians.all %} 
     {% if physician.service_patients.count %} 
      <div id="tabs-{{ forloop.counter }}"> 
       {% include "hospitalists/patient_list.html" %} 
      </div> 
     {% endif %} 
    {% endfor %} 

Vấn đề là mẫu patient_list đang mong đợi một danh sách các bệnh nhân tên là patients. Làm cách nào để đổi tên physician.service_patients thành patients trước khi đưa mẫu vào?

Cảm ơn, Pete

Trả lời

16

Sử dụng với tag:

{% for physician in physicians.all %} 
    {% if physician.service_patients.count %} 
     {% with physician.service_patients as patients %}     
     <div id="tabs-{{ forloop.counter }}"> 
      {% include "hospitalists/patient_list.html" %} 
     </div> 
     {% endwith %} 
    {% endif %} 
{% endfor %} 

Bạn cũng có thể nâng cấp lên tạo ra một thẻ tùy chỉnh:

{% for physician in physicians.all %} 
    {% if physician.service_patients.count %} 
     {% patient-list physician.service_patients %} 
    {% endif %} 
{% endfor %} 

Mặc dù thẻ tùy chỉnh liên quan đến viết mã Python, có các phím tắt mà làm cho nó dễ dàng để sử dụng một tệp mẫu hiện có dưới dạng thẻ: Django Inclusion Tags

+0

Cảm ơn bạn! Tôi tiếp tục tìm kiếm một thẻ "as". Tôi đoán "với" công trình quá. – slypete

+0

Như của Django 1.3 bạn cũng có thể sử dụng phong cách: '{% include" sometemplate.html "với spam = trứng, ham =" Ham! " %} '. –

3

Khi bạn có "chức năng" (cụ thể là một điều kiện if-) bên trong một vòng lặp, bạn có cơ hội để di chuyển này vào chức năng xem.

Đầu tiên

này xây dựng

{% for physician in physicians.all %} 
    {% if physician.service_patients.count %} 
    {% endif %} 
{% endfor %} 

là quá phổ biến mà bạn có nhiều cách để tránh nó.

  1. Thay đổi mô hình của bạn. Thêm patients" method and use it instead of the default query set that you get with a on-to-many relationship. This method of your model has the nếu service_patients.count` kiểm tra, xóa nó khỏi mẫu của bạn.

    Điều này giúp loại bỏ {% if%} khỏi mẫu của bạn, giảm {% cho%} và HTML thực tế, không thể loại bỏ dễ dàng.

  2. Thay đổi chức năng xem của bạn. Viết một vài dòng mã để tạo danh sách các bác sĩ với service_patients thay vì một bộ sưu tập đơn giản của các bác sĩ. Mã này trong hàm xem của bạn có thử nghiệm if service_patients.count, loại bỏ nó khỏi mẫu của bạn.

    Điều này giúp loại bỏ {% if%} khỏi mẫu của bạn, giảm {% cho%} và HTML thực tế, không thể loại bỏ dễ dàng.

Vấn đề là loại bỏ {% if%} để bạn chỉ cần cắt và dán {% cho%} và HTML thực tế. Bằng cách giữ mẫu của bạn chỉ trong HTML (mà không thể được loại bỏ), các chi phí chỉ là {% cho%}

Second

Dường như bạn muốn sử dụng một {% include %} xây dựng trong bối cảnh hơi khác nhau .

Hoàn toàn không rõ vấn đề với tệp {% include %} này là gì. Đó là "mong đợi một danh sách các bệnh nhân có tên là patients" có vẻ ngớ ngẩn một cách hời hợt. Sửa chữa nó, vì vậy nó hy vọng physician.patients.

Có lẽ bạn muốn sử dụng cùng một danh sách này hai lần. Khi có danh sách được gọi là 'patients' và một lần có danh sách được gọi là 'physician.patients'. Trong trường hợp này, hãy xem xét (a) đơn giản hóa hoặc (b) viết một thẻ mẫu.

Dường như bạn có danh sách bệnh nhân đôi khi là một trang độc lập và các lần khác được lặp lại nhiều lần trên một trang phức tạp hơn nhiều. Việc lặp lại danh sách các chi tiết được nhúng trong một số danh sách dài hơn không thực sự là thiết kế trang tốt nhất.Django không giúp bạn với điều này bởi vì - thẳng thắn - nó không dễ dàng cho mọi người sử dụng. Do đó, tùy chọn (a) - xem xét thiết kế lại danh sách "danh sách bệnh nhân trong danh sách bác sĩ" này quá phức tạp.

Tuy nhiên, bạn luôn có thể viết thẻ mẫu để tạo các trang thực sự phức tạp.

Tóm tắt

Có một lý do thực sự tốt tại sao Django mẫu ngôn ngữ có chức năng giới hạn. Tất cả chức năng của bạn phải là một tính năng thiết yếu của mô hình của bạn hoặc tính năng của ứng dụng hiện tại sử dụng mô hình.

Bản trình bày chỉ đơn giản là bản dịch của các đối tượng (và queryset) thành HTML. Không có gì khác

+0

S.Lott, tôi không chắc điều này thậm chí còn từ xa trả lời câu hỏi của tôi về việc sử dụng lại mẫu của tôi đang chờ một đối tượng có tên là bệnh nhân. – slypete

+0

Bạn có thể vui lòng xây dựng kể từ khi tôi vẫn còn trong bóng tối? – slypete

+0

S.Lott, cảm ơn bạn đã làm rõ. Khi kết hợp với một cái gì đó giống như giao diện tab của giao diện người dùng jQuery, lặp lại cùng một khuôn mẫu trong một bối cảnh phức tạp hơn trở nên rất có ích. Thẻ có là giải pháp đúng cho câu hỏi của tôi. – slypete

1

Theo cách này, bạn có thể thử sử dụng ngôn ngữ lập trình chất lượng jinja. Nó linh hoạt hơn.

+0

Tôi bắt đầu tin rằng động cơ templating của django là rất hạn chế rằng nó chỉ nên được vứt đi là tốt. – slypete

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