2011-04-07 27 views
5

Trong một mẫu Django, tôi muốn thêm các lớp học CSS để một DIV dựa trên "điều kiện" nhất định, ví dụ:Làm thế nào để xác đại diện nếu/khác để xác định các lớp CSS trong Django các mẫu

<div class="pkg-buildinfo 
      {% if v.release.version == pkg.b.release.version %}active{% else %}inactive{% endif %} 
      {% if v.release.version == project.latest.version %}latest{% else %}notlatest{% endif %}"> 

(lưu ý rằng v là một biến vòng lặp; toàn bộ điều là bên trong một vòng lặp for)

trên đây cho biết thêm các lớp CSS "hoạt động" hoặc "không hoạt động" và "mới nhất" hoặc "notlatest" dựa trên hai điều kiện.

Tuy nhiên, điều này khó đọc và tiết. Tôi phát hiện ra rằng with statement không hỗ trợ gán giá trị của các biểu thức/điều kiện (trái ngược với các biến phức tạp) mà là một điều đáng tiếc. Có cách nào tốt hơn để làm điều này?

+0

@jammon - cảm ơn cho chỉnh sửa, nhưng - được chuỗi multiline hỗ trợ trong HTML giá trị thuộc tính? –

+0

Ồ, điểm tốt! Tôi phải nhìn nó lên. – jammon

Trả lời

5

Bạn có thể đặt logic đó vào chế độ xem của mình thay thế và tạo thuộc tính trên đối tượng "đang hoạt động" hoặc "không hoạt động", v.v. Sau đó, bạn chỉ phải truy cập các thuộc tính trong mẫu.

3

Bạn có thể rút ngắn nó một chút bằng với tuyên bố:

{% with v.release.version as version %} 
<div class="pkg-buildinfo 
      {% if version == pkg.b.release.version %}active{% else %}inactive{% endif %} 
      {% if version == project.latest.version %}latest{% else %}notlatest{% endif %}"> 
{% endwith %} 

Nhưng nó chắc chắn sẽ tốt hơn nếu đặt logic đó vào xem:

context_data = { 
    'class_active': v.release.version == pkg.b.release.version and "active" or "inactive", 
    'class_latest': v.release.version == project.latest.version and "latest" or "notlatest", 
    ... } 

và trong mẫu:

<div class="pkg-buildinfo {{ class_active }} {{ class_latest }}" 
+0

Điều đó có thể là v.class_active ('v' là một biến vòng lặp) thay vì class_active. –

3

Bộ lọc tùy chỉnh có thể là một lựa chọn tốt đẹp.

@register.filter 
def active_class(obj, pkg): 
    if obj.release.version == pkg.b.release.version: 
     return 'active' 
    else: 
     return 'inactive' 

và sử dụng nó trong mẫu của bạn:

<div class="pkg-buildinfo {{ obj|active_class:pkg }}" 
+0

Có thể là một bất ngờ khi đọc mã của tôi một năm sau đó ("cần phải nhìn vào một nơi khác ngoài quan điểm và mẫu?" ... "tại sao 'active_class' không phải là một phương thức của lớp' obj'? "), nhưng nếu không thì tốt. –

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