<!doctype html>
<html lang="en" data-bs-theme="dark">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    
<title></title>
<meta name="description" content="">

    <link rel="stylesheet" href="/prism.css">
    
    <link rel="stylesheet" href="/dist/assets&#x2f;main-DPGhYD-r.css">
    
</head>
<body>

<div id="app">
    <nav class="navbar navbar-expand-lg bg-body-tertiary" aria-label="Thirteenth navbar example">
    <div class="container-fluid">
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar"
                aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse d-lg-flex" id="navbar">
            <a class="navbar-brand col-lg-3 me-0" href="/">Rust Web Framework</a>
            <ul class="navbar-nav col-lg-9 justify-content-lg-end">
                <li class="nav-item"><a class="nav-link" href="/docs">Docs</a></li>
                <li class="nav-item"><a class="nav-link" href="/about">About</a></li>
            </ul>
<!--            <div class="d-lg-flex col-lg-3 justify-content-lg-end">-->
<!--                <button class="btn btn-primary">Github</button>-->
<!--            </div>-->
        </div>
    </div>
</nav>
    
<div class="container pb-5 mb-5">
    <div class="row">
        <aside class="col-lg-3">
            <div class="sticky-top top-0 px-3 py-5">
                <h4>Table of Contents:</h4>
                <ul>
                    
                    <li><a href="/docs/intro">Introduction</a></li>
                    
                    <li><a href="/docs/getting-started">Getting Started</a></li>
                    
                    <li><a href="/docs/routing">Routing</a></li>
                    
                    <li><a href="/docs/actions">Actions</a></li>
                    
                    <li><a href="/docs/templates">Templates</a></li>
                    
                    <li><a href="/docs/deploying">Launching Your Website</a></li>
                    
                </ul>
            </div>
        </aside>
        <main class="col-lg-9">
            <article class="py-lg-5">
                <h1>Templates</h1>
<hr />
<p>Sturdy uses the battle-tested <code><a href="https://docs.rs/minijinja/latest/minijinja/">minijinja</a></code> library for templating.</p>
<p>Your templates reside in <code>resource/template</code>. <code>minijinja</code> is language agnostic, so you may use <code>.html</code>, <code>.md</code> or any other type of file you'd like.</p>
<p> </p>
<h2>Rendering Templates</h2>
<hr />
<pre><code class="language-rust">async fn handle(
    &amp;self,
    app: &amp;App,
    request: HttpRequest,
) -&gt; Result&lt;Box&lt;dyn Responsable&gt;, HttpError&gt; {
    // project-root/resource/template/user.html
    let result = app.template(&quot;user.html&quot;, Some(context! { name: &quot;John Doe&quot; }));

    match result {
        Ok(rendered) =&gt; Ok(Box::new(rendered)),
        Err(error) =&gt; Err(HttpError::new(500, error.to_string())),
    }
}
</code></pre>
<p>Read more: <a href="https://docs.rs/minijinja/latest/minijinja/macro.context.html"><code>minijinja::context</code></a>.</p>
<p> </p>
<h2>Template Interpolation</h2>
<hr />
<p>You may replace tokens in your templates for variable values.</p>
<pre><code class="language-jinja2">&lt;p&gt;Name: {{ user.name }}&lt;/p&gt;
</code></pre>
<p> </p>
<h2>Comments</h2>
<hr />
<pre><code class="language-jinja2">&lt;p&gt;This will be rendered.&lt;/p&gt;
{# This will not be rendered. #}
</code></pre>
<p> </p>
<h2>Control Flow</h2>
<hr />
<p>Control if content is displayed, loop over iterators.</p>
<p> </p>
<h3>If / elif / else</h3>
<hr />
<pre><code class="language-jinja2">&lt;p&gt;
    Role:
    {% if user.is_admin %}
        Admin
    {% elif user.is_mod %}
        Moderator
    {% else %}
        Member
    {% endif %}
&lt;/p&gt;
</code></pre>
<p> </p>
<h3>Loops</h3>
<hr />
<p>Assuming type: <code>Vec&lt;String&gt;</code>:</p>
<pre><code class="language-jinja2">&lt;ul&gt;
    {% for todo in todos %}
        &lt;li&gt;{{ todo }}&lt;/li&gt;
    {% endfor %}
&lt;/ul&gt;
</code></pre>
<p>Assuming type: <code>HashMap&lt;String, User&gt;</code>:</p>
<pre><code class="language-jinja2">&lt;ul&gt;
    {% for slug, post in posts|items %}
        &lt;li&gt;{{ post.title }}&lt;/li&gt;
    {% endfor %}
&lt;/ul&gt;
&lt;ul&gt;
    {% for id, user in posts|dictsort %}
        &lt;li&gt;{{ user.title }}&lt;/li&gt;
    {% endfor %}
&lt;/ul&gt;
</code></pre>
<p>Note the <code>|items</code> modifier after <code>posts</code>.</p>
<p> </p>
<h2>Template inheritance</h2>
<hr />
<p>Extend layouts for easy repetition and reuse.</p>
<p>Parent template <code>base.html</code>:</p>
<pre><code class="language-jinja2">&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
    {% block head %}
        &lt;title&gt;My Awesome Website&lt;/title&gt;
    {% endblock %}
&lt;/head&gt;
&lt;body&gt;
{% block content %}{% endblock %}
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Child template <code>my-page.html</code>:</p>
<pre><code class="language-jinja2">{% extends &quot;base.html&quot; %}
{% block head %}
    &lt;title&gt;My Awesome Page&lt;/title&gt;
{% endblock %}
{% block content %}
    &lt;p&gt;Hello world!&lt;/p&gt;
{% endblock %}
</code></pre>
<p> </p>
<p>Links:</p>
<ul>
<li><a href="https://docs.rs/minijinja/latest/minijinja/"><code>minijinja</code> docs</a></li>
<li><a href="https://docs.rs/minijinja/latest/minijinja/syntax/index.html#tags"><code>minijinja</code> template syntax</a></li>
<li><a href="https://jinja.palletsprojects.com/en/stable/templates/">Jinja templating reference</a></li>
</ul>
<p>Next steps:</p>
<ul>
<li><a href="/docs/deployment">Launching Your Website</a></li>
</ul>

            </article>
        </main>
    </div>
</div>

</div>


<script type="module" src="/dist/assets&#x2f;main-DCb8qEhQ.js"></script>

<script src="/prism.js"></script>
</body>
</html>