2015-11-02 20 views
10

Tôi có một vòng lặp trong một mẫu như thế nàyphá vỡ Remove dòng từ Django mẫu

{% spaceless %} 
{% for lang_code, lang_name in LANGUAGES %} 
    <link hreflang={{ lang_code }} href="http://example.com/ 
    {% if lang_code|length > 2 %} 
     {{ some_path }} 
    {% else %} 
     {{ other_path }} 
    {% endif %} 
    "> 
{% endfor %} 
{% endspaceless %} 

nào tạo ra một cái gì đó như thế này

<link hreflang="en-gb" href="http://example.com/ 
    some_path/ 
    "><link hreflang="de" ...> 

Có thể viết lại đoạn mã này để toàn bộ thẻ được viết trong một dòng như vậy?

<link hreflang="en-gb" href="http://example.com/some_path/"> 
<link hreflang="de" href="http://example.com/other_path/"> 
... 

P.S. Điều này có thể đạt được nếu mệnh đề if/else được kéo dài trên một dòng, nhưng sau đó dòng trở nên không thể đọc được.

Trả lời

4

Thẻ spaceless loại bỏ khoảng trắng giữa các thẻ html, bạn không thể xóa không gian trong thẻ, như bạn đang cố gắng thực hiện.

Bạn có thể ngăn chặn các dòng mới bằng cách đặt mệnh đề if/else trên một dòng, nhưng như bạn nói, điều đó gây khó đọc. Điều này gợi ý với tôi rằng bạn đang cố gắng làm quá nhiều công việc trong các mẫu Django, và rằng các url nên được xây dựng ở nơi khác.

Tùy chọn đơn giản nhất là xây dựng danh sách các thẻ (language_code, url) trong chế độ xem và lặp qua các thẻ này trong mẫu.

{% for lang_code, url in language_urls %} 
    <link hreflang={{ lang_code }} href="{{ url }}"> 
{% endfor %} 

Nếu nó không thuận tiện để làm điều này trong giao diện khác vài tùy chọn là:

  • một bộ xử lý mẫu ngữ cảnh (tốt nếu bạn sử dụng các url cùng trong mỗi xem
  • một thẻ/bộ lọc mẫu tùy chỉnh (tốt nếu some_pathother_path là động)
+0

Tôi nghĩ, "tất nhiên, django có một cái gì đó cho nó chắc chắn" nhưng không, bạn cần phải xây dựng bộ lọc tùy chỉnh của riêng bạn hoặc làm như Alasdair cho thấy – doniyor

+0

@ Alasdair, vâng tôi nghĩ vậy. Tôi đoán tôi sẽ chỉ cần viết một templatetag để xây dựng URL của tôi và giữ mẫu sạch sẽ. Cảm ơn, tôi sẽ chấp nhận câu trả lời của bạn! – abudis

6

Tôi cần thứ tương tự, bởi vì tôi đang sử dụng một mẫu để tạo ra một dòng tiêu đề email (không phải HTML, vì vậy {% spaceless %} là vô ích). Trong trường hợp của tôi, bản mẫu đã thực hiện rất nhiều trường hợp khác nhau và mọi thứ phải được viết thành một dòng trên 500 ký tự.

Vì vậy, trong những suy nghĩ của {% spaceless %}, tôi đã viết của riêng tôi {% linebreakless %}:

import six 
from django import template 
from django.template.base import Node 
from django.utils.functional import allow_lazy 


register = template.Library() 


@register.tag 
def linebreakless(parser, token): 
    nodelist = parser.parse(('endlinebreakless',)) 
    parser.delete_first_token() 
    return LinebreaklessNode(nodelist) 


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

    def render(self, context): 
     strip_line_breaks = allow_lazy(lambda x: x.replace('\n', ''), six.text_type) 
     return strip_line_breaks(self.nodelist.render(context).strip()) 

Xin lưu ý rằng nó (cố ý!) Bảo tồn tất cả các khoảng trắng trừ ngắt dòng.

Một cách sử dụng ví dụ cho một mẫu email sẽ trông như thế này, giả định trên được nạp trong một module mẫu thẻ gọi linebreakless.py:

{% load linebreakless %}{% linebreakless %} 

{# Email subjects are (encoded) text, not HTML, so we don't need any autoescaping! #} 
{% autoescape off %} 

New Notification 
• 
{% if flag %} 
about this 
{% else %} 
about that 
{% endif %} 
! 

{% endautoescape %} 
{% endlinebreakless %} 

Lưu ý rằng thẻ {% linebreakless %} có được trên dòng đầu tiên (và sau khi chỉ thị {% load %}) để ngăn chặn bất kỳ ngắt dòng nào trong tệp được tạo.

+0

Nếu điều này nghe có vẻ phức tạp không cần thiết đối với bạn đối với trường hợp sử dụng mà tôi phác thảo, và bạn nghĩ rằng nó cũng có thể được giải quyết bằng một 're.sub đơn giản (r '\ s * \ n \ s *', '', rendered_subject_template). strip() 'sau khi hiển thị mẫu, sau đó bạn hoàn toàn đúng. Đó là những gì tôi đã làm, và tôi đã bỏ thẻ mẫu, nhưng tôi vẫn nghĩ rằng nó có thể hữu ích cho người khác đăng nó ở đây. –

+0

Tôi đã kết thúc viết một thẻ mẫu tùy chỉnh và chuyển tất cả các logic đó, nhưng tôi cũng thích giải pháp của bạn. Cảm ơn! – abudis

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