Pytanie Jinja2 poprawnie wcięte zawarte bloku


Mam dwa pliki:

base.html

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>{{title}}</title>
    </head>
    <body>
       {% block content %}
       {% endblock %}   
    </body>
</html>

register.html

{% extends "base.html" %}
{% block content %}
<h1>Register</h1>
<form action="" method="post" name="register">
    {{ form.hidden_tag() }}
    {{ form.login.label }} {{ form.login(size=20) }}
    {{ form.password.label }} {{ form.password(size=20) }}
    <input type="submit" value="Register">
</form>
{% endblock %}

Jest renderowany w ten sposób:

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>Register</title>
    </head>
    <body>

<h1>Register</h1>
<form action="" method="post" name="register">
    <div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="1393257771.168161##ce877b3519f192c05d3b409f3b7b07bb147dead7"></div>
    <label for="login">login</label> <input id="login" name="login" size="20" type="text" value="">
    <label for="password">password</label> <input id="password" name="password" size="20" type="password" value="">
    <input type="submit" value="Register">
</form>

    </body>
</html>

Chciałbym osiągnąć to:

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>Register</title>
    </head>
    <body>
        <h1>Register</h1>
        <form action="" method="post" name="register">
            <div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="1393257771.168161##ce877b3519f192c05d3b409f3b7b07bb147dead7"></div>
            <label for="login">login</label> <input id="login" name="login" size="20" type="text" value="">
            <label for="password">password</label> <input id="password" name="password" size="20" type="password" value="">
            <input type="submit" value="Register">
        </form>
    </body>
</html>

Czy czegoś brakuje? Próbowałem też Google'a i mieszałem z wcięciami szablonu indent filtr nie ma tutaj zastosowania. Nie chcę sztywno kodować wcięcia w wewnętrznym bloku, ponieważ mogłoby to zepsuć się, jeśli zdecyduję się zmienić formatowanie i elementy w bazie później.


21
2018-02-24 15:08


pochodzenie


Jeśli wcisk register.html z 8 spacjami, uzyskasz pożądany wynik. - voscausa
@voscausa - Tego właśnie chcę uniknąć. Wcięcie w base.html może zmienić. Nie chcę ponownie wcięć register.html każdego razu. - Fenikso


Odpowiedzi:


Dobre pytanie. Wierzę, że Jinja2 tego nie robi.

Głównym pytaniem, które musisz sobie postawić, jest to, dlaczego chcesz, aby kod HTML był poprawnie wcięty, ponieważ przeglądarki go nie interesują. W aplikacji produkcyjnej lepiej jest przejść w drugą stronę i usunąć całą białą przestrzeń, aby strona była mniejsza.

Jeśli jesteś zainteresowany zrobieniem tego podczas programowania, możesz przekazać HTML wygenerowany przez render_template() przez wgłębnik taki jak prettify() od BeautifulSoup. Nie polecam tego dla systemu produkcyjnego, ponieważ twoje funkcje będą działać dłużej.


6
2018-02-24 15:30



Nadal napotykam ten problem, ponieważ próbuję wyprzedzić RAML za pomocą jinja2 :) - DataGreed
Wiem, że OP jest, ale należy wziąć pod uwagę, że nie wszyscy używają Jinja w plikach HTML. Na przykład w Krajacz ciastek, Jinja może być przeplatana w plikach niekodujących, takich jak Markdown, gdzie wcięcie dodatkowej zakładki ze względu na białe spacje jest znaczące. - Taylor Edmiston


Chociaż uważam, że zwiększenie rozmiaru dokumentu jest dobrym argumentem przeciwko "poprawnemu" wcięciu dokumentów, jinja2 faktycznie zapewnia funkcję robić dokładnie to, co ty:

indent(s, width=4, indentfirst=False)

którego używałbyś w swoim base.html z makrem, jak opisano w ta odpowiedź na SO.

Prawdopodobnie i tak zrobię to makro i zadzwonię do niego render_register_form:

{% macro render_register_form(form) %}
    <h1>Register</h1>
    <form action="" method="post" name="register">
        {{ form.hidden_tag() }}
        {{ form.login.label }} {{ form.login(size=20) }}
        {{ form.password.label }} {{ form.password(size=20) }}
        <input type="submit" value="Register">
    </form>
{% endmacro %}

a następnie dołączyć go tam, gdzie jest to potrzebne, na przykład z wcięciem 8 spacji, jako:

{{ render_register_form(my_form)|indent(8, True) }}

22
2017-08-06 12:52



Co powiesz na {% call render_register_form(my_form) %}? - Gill Bates
Nie jestem pewien, co twój komentarz adresuje @GillBates ... Czy możesz trochę rozwinąć? - Midnighter