2013-04-02 19 views
6

Oluşturulan görünümde, hata ayıklama modunda şablon oluşturma hakkında ayrıntılı bilgiler yazmak mümkün mü? Örneğin böyle çıktı üretecektir:Django şablon etiketlerindeki ayrıntılı mod

base.html:

<html> 
<body> 
{% block content %} 
{% endblock %} 
</body> 
</html> 

sayfa.html:

<html> 
<body> 
<!-- block content --> 
<!-- from "page.html" --> 
Foo 
<!-- include "inner.html" --> 
Bar 
<!-- endblock content --> 
</body> 
</html> 

Neden: Böyle forma içine

{% extend "base.html" %} 
{% block content %} 
Foo 
{% include "inner.html" %} 
Bar 
{% endblock %} 

? Bazen bazı büyük bağımlılıkları araştırmak sadece IDE tarafından çok zordur. Ya da daha kolay gezinmek için (grafikler oluşturmak gibi) iyi bir araç biliyor musunuz? Elbette bu bilgiler sadece hata ayıklama modunda oluşturulmalıdır. Üretimde ortadan kalkarlar.

+2

İyi soru! ['Django-debug-toolbar'] (https://github.com/django-debug-toolbar/django-debug-toolbar) veya [' django-template-repl'] (https: // github) olup olmadığını görebilirsiniz. .com/codysoyland/django-template-repl) yardımcı oluyor. –

+0

Benim için 'django-template-repl' tamamen işe yaramıyor, çünkü tüm dosya ağacına girmem gerekiyor ve eğer hangi dosyanın kötüye olduğunu bilirsem cevabım onsuz olur. Şu anda oluşturduğum koddaki sihirli şablonlar nedeniyle bu soruyu oluşturdum. Bu, eklenen modele bağlı olarak sihir kullanıyor (liste olarak şablonlar: '(" {app_label}/{model}/{template} .html "," {template} .html ")') ve çıktı içeriği kullanılarak farklı şablona çok benzer. 'django-debug-toolbar' yakın ama yeterli değil, şimdi kullanıyorum. – zwierzak

+0

sihir kötülüktür. Her bloktan sonra html yorumu eklemek/her bir engelle ilgili küçük bir sed script'i düşündünüz mü? – ornoone

cevap

2

Bunu middlware kullanarak gerçekleştirebilirsiniz. Şablonları ve bunları çağıran görünümleri takip ederken bir yandan da benzer bir sorun yaşıyordum. Bu nedenle, html yanıtının üst kısmına bir yorum bloğu ekleyen bir ara katman snippet'i yazdım. İstediğin şeyi yapmıyor, ama uyarlayabiliyorsun.

COMMENT_BLOCK = """ 
<!-- 
[ url  ] >> http://%(host)s%(path)s 
[ referer ] >> %(referer)s 
[ module ] >> %(module)s 
[ function ] >> %(function)s, line %(line)s 
[ args  ] >> args=%(args)s, kwargs=%(kwargs)s, defaults=%(defaults)s 
[ template ] >> %(template)s 
--> 

""" 

# Add any additional template types you wish to add the comment block to. 
MIMETYPES = (
    "text/html", 
    "text/xml", 
) 


class HtmlTemplateFinder: 

    def __init__(self): 
     self.host = None 
     self.referer = None 
     self.path = None 
     self.module = None 
     self.function = None 
     self.line = None 
     self.args = None 
     self.kwargs = None 
     self.defaults = None 
     self.template = None 
     self.valid_template = False 

    def _populate_comment_block(self): 
     return COMMENT_BLOCK % { 
           'host': self.host, 
           'referer': self.referer, 
           'path': self.path, 
           'module': self.module, 
           'function': self.function, 
           'line': self.line, 
           'args': self.args, 
           'kwargs': self.kwargs, 
           'defaults': self.defaults, 
           'template': self.template, 
           } 

    def process_view(self, request, view_func, view_args, view_kwargs): 
     self.host = request.META.get('HTTP_HOST', None) 
     self.referer = request.META.get('HTTP_REFERER', None) 
     self.path = request.path 
     self.module = view_func.func_code.co_filename 
     self.function = ('.').join((view_func.__module__, view_func.func_name)) 
     self.line = view_func.func_code.co_firstlineno 
     self.args = view_args 
     self.kwargs = view_kwargs 
     self.defaults = view_func.func_defaults 
     return None 

    def process_template_response(self, request, response): 
     from mimetypes import guess_type 
     # Use this rather than response.template_name, this always returns str 
     self.template = response.resolve_template(response.template_name).name 
     self.valid_template = guess_type(self.template)[0] in MIMETYPES 
     return response 

    def process_response(self, request, response): 
     from <your app> import settings 
     if settings.DEBUG: 
      if self.valid_template: 
       block = self._populate_comment_block() 
       response.content = "%s%s" % (block, response.content) 
     return response 
İlgili konular