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?
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