Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

flask - Jinja2 correctly indent included block

I have two files:

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 %}

It gets rendered like this:

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

I would like to achieve this:

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

Am I missing something? I tried Google and messing with the template indentations, also indent filter does not seem to apply here. I do not want to hard-code the indentation in the inner block, as that would break if I decide to change the formatting and elements in the base later.

question from:https://stackoverflow.com/questions/21991479/jinja2-correctly-indent-included-block

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Although I think the increase in document size is a good argument against "correctly" indenting documents, jinja2 actually provides a function to do just what you what:

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

which you would use in your base.html with a macro, as described in this answer on SO.

I would probably make that a macro anyway and call it 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 %}

and then include it where needed, for example, with 8 spaces indentation, as:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...