2013-01-04 31 views
14

Tôi đang gặp một thời gian khó khăn cố gắng để có được mẫu động cơ của Django để thụt đúng khi mở rộng/bao gồm mẫuDjango template engine thụt đầu dòng

những tập tin này:

index.html

<html> 
    <body> 
     <div id="hello"> 
      {% block bar %} 
      {% endblock %} 

      {% include 'baz.html'%} 
     </div> 
    </body> 
</html> 

bar.html

{% extends 'foo.html' %} 

{% block bar %} 
<p>bar</p> 
{% endblock %} 

baz.html

<p>baz</p> 

sẽ làm như

<html> 
    <body> 
     <div id="hello"> 
<p>bar</p> 
<p>baz</p> 
     </div> 
    </body> 
</html> 

Làm thế nào tôi có thể sửa chữa nó để nó ám như

<html> 
    <body> 
     <div id="hello"> 
      <p>bar</p> 
      <p>baz</p> 
     </div> 
    </body> 
</html> 

tab vào thủ không phải là một lựa chọn. Tôi đang sử dụng các tab mềm (4 dấu cách) nếu điều này quan trọng.

+4

Tôi không chắc tại sao nó lại quan trọng. Tuy nhiên, các trình duyệt bỏ qua thụt đầu dòng, lý do duy nhất cho nó là làm cho nó dễ đọc hơn trong trình soạn thảo văn bản của bạn - và ở đó bạn sẽ không bao giờ thấy trang được hiển thị đầy đủ. –

Trả lời

6

thụt đầu dòng không được chèn tự động bởi mẫu kế thừa của Django. Để đạt được thụt đầu dòng mà bạn mong muốn, bạn cần phải bao gồm nó trong phạm vi bar.html:

{% extends 'foo.html' %} 

{% block bar %} 
      <p>bar</p> 
{% endblock %} 
+0

Có thực sự không có cách nào khác? Tôi sẽ kết thúc với các tệp có 6 cấp độ thụt lề. – rxdazn

+0

Thực sự. Bạn sẽ phải viết thẻ '{% block%}' của riêng bạn. –

2

Bạn nên giải thích với mục đích là nhu cầu thụt lề của bạn.

thụt lề là rất hữu ích trong bước gỡ lỗi, nhưng thụt đầu dòng không tương thích với tối ưu hóa, bởi vì điều này tồn tại spaceless bộ lọc.

Bạn có thể viết Snipped riêng bạn:

@register.tag 
def myinden(parser, token): 
    args = token.contents.split() 
    n = args[1] 
    nodelist = parser.parse(('endmyinden',)) 
    parser.delete_first_token() 
    return MyIndenNode(nodelist, n) 

class MyIndenNode(Node, n): 
    def __init__(self, nodelist, n): 
     self.nodelist = nodelist 
     self.n = n 

    def render(self, context): 
     import re 
     regex = re.compile("^", re.M) 
     return re.sub(regex, "\t"*int(self.n), 
         self.nodelist.render(context).strip()) 

Để sử dụng:

index.html 
{% include 'baz.html' with indentation="8" %} 

baz.html 
{{ myindent:myindentation }} 
... 

Chú ý, không được kiểm tra. Ngoài ra, tôi khuyên bạn nên sửa đổi đoạn mã để chỉ hoạt động ở chế độ gỡ lỗi:

+0

Nó chỉ cho bản thân tôi, thực sự. Tôi không thích có các tệp như thế này https: //gist.github.com/3c73384133e553ad6567 Nếu tôi đã phải đối mặt với một tập tin như thế này, tôi sẽ tự hỏi tại sao có rất nhiều không gian lúc đầu. – rxdazn

1

Một tùy chọn khác từ nêu trên là sử dụng Beautiful Soup middleware.

Đây là tutorial. Lưu ý rằng mọi người gọi phần mềm trung gian này là `` REALLY SLOW '' và tư vấn lưu vào bộ nhớ đệm trang đầu ra.

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