2010-08-11 18 views
8

Trong hệ thống mẫu của Django, nếu tôi có khối mà tôi muốn tạo tùy chọn bằng cách sử dụng câu lệnh if, làm cách nào để thực hiện?Có cách nào để tạo khối tùy chọn trong mẫu Django

Tôi đã cố gắng này:

{% if val %}{% block title %}Archive {{ foo }}{% endblock %}{% endif %} 

Nhưng điều đó không làm việc. Có cách nào để làm điều đó, vì vậy mà đối với một giá trị nhất định (trong trường hợp này Null) khối không được ban hành và mẫu cơ sở sử dụng các giá trị ban đầu?

Chỉnh sửa: Hãy để tôi cụ thể hơn một chút, để dễ trả lời hơn.

Tôi có một trang với 10 mục nhập mỗi trang. Sau đó, người dùng có thể truy cập trang tiếp theo và xem mười mục tiếp theo. Đối với mỗi trang tiếp theo họ đi qua, trước tiên, tôi muốn có thẻ tiêu đề nói điều gì đó như "Lưu trữ 1" hoặc "Lưu trữ 10" nhưng nếu họ quay lại trang gốc, nó không còn lưu trữ và chỉ cần đi đến tiêu đề trang web ban đầu đã được đưa ra trong các mẫu cơ sở.

+0

Tôi không biết câu trả lời cho câu hỏi của bạn, nhưng bạn có biết về bộ lọc 'mặc định' - điều đó có làm những gì bạn muốn không? http://docs.djangoproject.com/en/dev/ref/templates/builtins/#default –

+0

Cảm ơn Dominic, tôi đang tìm kiếm điều gì đó tương tự, nhưng tôi không tìm cách chỉ định mặc định, tôi đang cố gắng tìm ra nếu tôi có thể đặt một tuyên bố nếu xung quanh khối? – Vernon

Trả lời

8

Theo như tôi hiểu, block s là trình giữ chỗ được "ghi đè" trong các mẫu con. Chúng phải được xác định tại "thời gian biên dịch" và không phải là "thời gian chạy".

Đối với vấn đề cụ thể của bạn tại sao không sửa đổi tiêu đề dựa trên số trang (giả sử bạn sử dụng phân trang)? Một cái gì đó như thế này:

{% block title %} 
    {% ifequal page 1 %}Current{% else %}Archive {{ page }}{% endifequal %} 
{% endblock %} 
15

Tôi gặp sự cố tương tự với dự án tôi đang làm việc. Đây là cách tôi giải quyết nó bằng cách sử {{block.super}} để kéo giá trị mặc định từ khối mẹ:

mẫu cha mẹ của tôi bao gồm:

{% block title %}Default Title{% endblock %} 

My mẫu con chứa:

{% block title %} 
    {% if new_title %}{{ new_title }}{% else %}{{ block.super }}{% endif %} 
{% endblock %} 

* Lưu ý: Bạn có thể muốn bọc mã trong {% spaceless%} {% endspaceless%} nếu bạn dự định sử dụng kết quả trong thẻ tiêu đề HTML.

(Dường như Jordan Reiter gửi cùng một giải pháp trong các ý kiến ​​của câu hỏi ban đầu một chút trước khi phản ứng của tôi.)

+0

Cảm ơn, tôi biết ngay từ đầu rằng tôi chỉ có thể đặt các câu lệnh bên trong khối, tôi đã tự hỏi, tôi đoán, nếu tôi làm một khối tùy chọn - tôi đoán là không. – Vernon

+0

Brilliant! Điều này cho phép tôi bật/tắt các khối dựa trên giá trị biểu mẫu (vì vậy tôi có thể có phiên bản có thể in của kết quả). – sage

+1

'{{block.super}}' đã thực hiện thủ thuật. – AliBZ

0

tôi sẽ chỉ phải thêm vào các câu trả lời tốt ở trên rằng tùy thuộc vào phiên bản Django đôi khi các {{ block.super }} đặt nội dung từ chủ hai lần, điều này dường như xảy ra trong các phiên bản mới nhất của Django.

Tôi đang sử dụng Django 1,8 và bất cứ khi nào tôi đặt các {{ block.super }} nó bắt đầu cư xử theo cách đó cũng giống như một sự bổ sung cho câu trả lời Jamie tôi có thể nói rằng trong các mẫu cơ sở bạn có thể đặt nội dung bạn muốn

{% block title %} Default Title {% endblock %} 

Và sau đó ở trẻ em nếu bạn muốn chân trang được thừa kế và hiển thị chỉ không làm bất cứ điều gì nó sẽ được. Nhưng nếu bạn không muốn khối đó sẽ được hiển thị sau đó đưa thẻ ở trẻ em với nội dung rỗng chỉ như thế này:

{% block title %} 

{% endblock %} 

Sau đó, nó sẽ được ẩn khi nó được trả lại bạn cũng có thể ghi đè lên nội dung trên đó nếu Bạn ước.

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