2013-03-09 28 views
22

Tôi đang sử dụng mẫu Django trong dự án không phải Django và tôi muốn đảm bảo rằng mẫu của tôi không chứa tham chiếu đến biến không nằm trong ngữ cảnh và cho rằng tôi cần Django mẫu renderer để nâng cao một lỗi khi nó thấy {{ non_existent_variable }} khi không có non_existent_variable trong Bối cảnh.Cách tạo mẫu Django nâng lỗi nếu biến bị thiếu trong ngữ cảnh

TEMPLATE_STRING_IF_INVALID có thể được đặt thành thứ gì đó và sau đó chúng tôi có thể kiểm tra xem cái gì đó này không có trong mẫu được hiển thị hay không, nhưng đó không phải là thanh lịch chút nào.

Tôi có thể bằng cách nào đó mà không có quá nhiều công việc ghi đè cách Ngữ cảnh nuốt các lỗi chính không?

+1

http://djangosnippets.org/snippets/646/ – catherine

+0

Tôi không thấy một lý do thuyết phục để sử dụng mẫu động cơ Django bên ngoài một dự án Django . Django mẫu động cơ được thiết kế để được "web-thiết kế-proof", và hành vi này chỉ là một trong những thỏa hiệp được thực hiện. Bạn đã nghe nói về Jinja2 chưa? –

+0

Cảm ơn @catherine! Nó hoạt động. – jbasko

Trả lời

20

Có một Django Snippet cung cấp một giải pháp:

# settings.py 
class InvalidVarException(object): 
    def __mod__(self, missing): 
     try: 
      missing_str=unicode(missing) 
     except: 
      missing_str='Failed to create string representation' 
     raise Exception('Unknown template variable %r %s' % (missing, missing_str)) 
    def __contains__(self, search): 
     if search=='%s': 
      return True 
     return False 

TEMPLATE_DEBUG=True 
TEMPLATE_STRING_IF_INVALID = InvalidVarException() 
+0

Điều này rất hữu ích nhưng nó sẽ không bắt gặp biến bị thiếu trong '{% if not i_do_not_exist%}'. Có sửa chữa không? – Medorator

+2

Điều này thật tuyệt vời, cảm ơn bạn. Lưu ý rằng trong Django 1.8+, bạn cần đặt 'OPTIONS ['debug']' và 'OPTIONS ['string_if_invalid']' thay thế. Nhưng có cách nào để làm cho nó hoạt động trong các kịch bản 'missing_var | default:" foo "'? Dường như điều này tăng trước khi 'mặc định' có cơ hội để làm điều đó. –

+0

Tôi đã thử giải pháp này với Django 1.11, sử dụng 'string_if_invalid' và tôi gặp lỗi này khi chạy máy chủ:'?: (Templates.E002) 'string_if_invalid' trong TÙY CHỌN TEMPLATES phải là một chuỗi nhưng có: (InvalidVarException) .' –

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