2016-02-22 15 views
5

Tôi có một ứng dụng Django sử dụng hệ thống mẫu Django để tạo đầu ra (không phải HTML) của nó, ngoài giao diện web. Có một tập hợp các trang nơi người dùng có thể tạo mẫu cho báo cáo, thêm {{}} thẻ để thay thế biến và thêm thư viện templatetag để định dạng những thứ độc đáo.động cơ mẫu django với kiểm tra lỗi?

Tuy nhiên, cách hiện tại tôi đang làm điều này chỉ là:

t = Template(component_template) 
self.output_content = t.render(component_context) 

Trong đó sử dụng các template engine web-đầu ra mặc định. Điều này có string_if_invalid được đặt thành None và cảnh báo nghiêm trọng trong hướng dẫn về cách phá vỡ các trang quản trị nếu bạn thay đổi nó.

Vì vậy, nếu người dùng nhận được lỗi đánh máy trong tên biến trong thẻ, nó sẽ bị bỏ qua và biến nó thành đầu ra. Nếu họ có một thẻ bị xé, nó thực sự giết chết ứng dụng web. Tôi đang tìm một cách để xác nhận mẫu tại thời điểm chỉnh sửa, để người dùng có thể được cảnh báo rằng các thay đổi là cần thiết.

Những gì tôi đang hướng tới là một cái gì đó giống như đầu ra trình biên dịch:

unknown variable 'ffsdfd' on line 33 of template 
template syntax error on line 22 of template 

Suy nghĩ đầu tiên của tôi là tạo ra một mẫu động cơ mới() và sử dụng cho một mục đích này, vì vậy tôi có thể nhận ra một mặc định đặc biệt string_if_invalid nhưng điều đó không cho tôi biết bất cứ điều gì về biến bị thiếu/không chính xác.

engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'], 
       context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'], 
       app_dirs=settings.TEMPLATES[0]['APP_DIRS']) 

t = Template(component_template, engine=engine) 

try: 
    self.output_content = t.render(component_context) 
except TemplateSyntaxError: 
    pass # do something useful here to collect error messages 

Các TemplateSyntaxError ngoại lệ hoạt động, ngoại trừ tôi không nhận được bất kỳ thông tin ngữ cảnh, giống như nơi mà các lỗi thực sự là, và tất nhiên tôi chỉ nhận được sự thất bại đầu tiên. Nhìn vào mã django.template, có vẻ như trong nội bộ có một số loại ngoại lệ mở rộng có số dòng và mã thông báo khiến nó bị nghẹn, nhưng nó không thoát khỏi phương thức render().

Vì vậy:

Làm cách nào để cung cấp lỗi xử lý lỗi hữu ích trong các mẫu do người dùng chỉnh sửa? Tôi có nên làm điều này một cách hoàn toàn khác?

Trả lời

4

Đây là cách tôi tự giải quyết bằng cách sử dụng lớp tùy chỉnh và string_if_invalid. Nó mang lại cho bạn tên biến, nhưng tôi chắc chắn bạn có thể tinh chỉnh thêm để có thêm thông tin ngữ cảnh.

toàn cầu ví dụ settings.py, nên dễ dàng thích nghi với ví dụ nội tuyến của bạn:

class InvalidTemplateVariable(str): 
    def __mod__(self,other): 
     from django.template.base import TemplateSyntaxError 
     raise TemplateSyntaxError("Invalid variable : '%s'" % other) 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [....], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'string_if_invalid': InvalidTemplateVariable("%s"), 
      'context_processors': [ 
       .... 
      ], 
     }, 
    }, 
] 

BTW, bạn có thể nhận được thông tin bổ sung về cách/tại sao điều này làm việc tại bài viết sau đây (mà tôi đã viết) http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror

+0

Aha! Vì vậy, thực sự phần tôi đã mất là: "Nếu string_if_invalid chứa một '% s', dấu định dạng sẽ được thay thế bằng tên của biến không hợp lệ." (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (Nhưng chuyển đổi từ str thành exception là tốt đẹp!) – AnotherHowie

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