2012-10-16 60 views
23

Tôi có mẫu django được sử dụng từ nhiều chế độ xem. Mẫu có một khối cho các thư được sử dụng để thông báo cho người dùng về bất kỳ điều gì cần chú ý. Cho dù tin nhắn được gửi hay không phụ thuộc vào lượt xem. Một số chế độ xem có thể gửi biến số message cho mẫu trong khi các chế độ xem khác có thể không gửi.Cách kiểm tra xem biến mẫu django có được xác định không?

view_1: 
    message = "This is an important message" 
    render_to_response("my_template.html", 
         {'message':message, 'foo':foo, 'bar':bar}, 
         context_instance = RequestContext(request)) 

view_2: 
    message = "This is an important message" 
    render_to_response("my_template.html", 
         {'foo':foo, 'bar':bar}, 
         context_instance = RequestContext(request)) 

Trong mẫu, tôi kiểm tra sự biến message và bao gồm các khối như sau:

base_template.html: 
    .... 
    {% block main_body %} 
     {% block messages %} 
     {% endblock %} 
     {% block content %} 
     {% endblock %} 
    {% endblock %} 
    .... 

my_template.html: 
    {% extends base_template.html %} 
    .... 
    {% if message %} 
      {% block messages %} 
       <div class='imp_msg'>{{ message }} </div> 
      {% endblock %} 
    {% endif %} 
    ... 

Vấn đề là ngay cả khi view_2 không vượt qua một tin nhắn, html thức được render với <div class='imp_msg'></div> - về cơ bản là một div trống.

Vì CSS đó được thiết kế để cung cấp nền tảng light_red cho thư, những gì tôi thấy là thanh light_red trống ở đầu trang.

Tôi cũng đã thử: {% ifnotequal message None %}, {% ifnotequal message '' %}, đã thử đặt message thành None hoặc '' một cách rõ ràng, nhưng dường như không hữu ích.

Sẽ đánh giá cao một số trợ giúp!

Trả lời

28

Bạn cần phải chuyển đổi của bạn {% block %} và bạn {% if %}

{% block messages %} 
    {% if message %}<div class='imp_message'>{{ message }}</div>{% endif %} 
{% endblock %} 
+0

Cảm ơn @Colleen. Điều đó hiệu quả. Bạn có thể vui lòng giải thích mặc dù tại sao cách khác không? Tôi chỉ cảm thấy nó là hợp lý để bao gồm các khối chỉ khi tin nhắn tồn tại. – zaphod

+0

Tôi nghĩ * đó là vì bạn có '{% khối tin%}' trong mẫu cơ sở của bạn, và công cụ dựng mẫu django sẽ lấy và tìm kiếm và tiêm, chặn bất cứ nơi nào nó mở rộng và bỏ qua bất kỳ 'if' hoặc bất cứ điều gì khác xung quanh nó. Điều đó đang được nói, tôi không thể thề với bạn rằng một '{% if%}' xung quanh một '{% block%}' sẽ làm việc-- Tôi chưa bao giờ thử nó, vì vậy tôi không biết một trong hai cách. Nó có thể là nó không bao giờ hoạt động, và đó là vấn đề chính, không phải là bạn có '{% block messages%}' trong cơ sở của bạn. – Colleen

+2

http://stackoverflow.com/questions/942797/why-cant-i-nest-a-block-tag-inside-an-if-tag làm cho âm thanh như thể nó là cũ. Tôi nghĩ nếu '{% if%}' của bạn nằm trong cơ sở, thì nó sẽ hoạt động. Hoặc nếu khối không ở trong cơ sở. – Colleen

11

Để kiểm tra, trong một câu lệnh if, bạn cần phải so sánh giá trị tới Không, như thế này:

{% if some_missing_var != None %} 
    // code here if some_missing_var exists 
{% else %} 
    // code here if some_missing_var does not exist 
{% endif %} 

Trong các trường hợp khác (từ tài liệu):

Nói chung, nếu biến không tồn tại, hệ thống mẫu sẽ chèn giá trị của optio cấu hình string_if_invalid của động cơ n, được đặt thành '' (chuỗi rỗng) theo mặc định.

Tôi đã thử một số câu trả lời khác và chúng không hoạt động cho đến khi tôi đọc tài liệu và các tài liệu trên đã được làm rõ.

link to docs that describe handling invalid variables

+1

Điều này làm việc tuyệt vời cho tôi. Trong trường hợp sử dụng của tôi, tôi đã nhận được một danh sách các kết quả từ một tìm kiếm và nó đã thất bại nếu tôi đã làm '{% if result%}' ngay cả khi 'kết quả' được định nghĩa nhưng trống. Tôi muốn nó vượt qua khi 'kết quả' được xác định và thất bại khi kết quả không được xác định. Để trống 'kết quả', tôi muốn hiển thị một thông báo khác. Việc kiểm tra 'None' hoạt động tốt. – Anupam

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