2

ブログを書くときは、各ブログ投稿を独自の .html ファイルに分けるのが好きです (それでよろしいですか?)

これにより、ファイルが大きくなりすぎるのを防ぎ、必要に応じて以前に書いたブログ投稿に戻って編集することが容易になります。

ブログ投稿に css/js/ajax/template 変数が含まれることがあります。

しかし、私の Web サイトでは、すべてのブログ記事が 1 つのページにまとめられているのが気に入っています (記事ごとに個別のページに移動するのではなく、すべてのブログ記事をスクロールできます)。

2 つのブログ投稿を含む html ファイルを次に示します。

{% extends "base.html" %}
{% block blog_posts %}
    <!-- links/targest for the side menu to jump to a post -->
    <li><a href="#post2">Post2 - April 2012</a></li>
    <li><a href="#post1">Post1 - Feb 2012</a></li>
{% endblock %}

{% block content %}

<div id="post1">
spam1 blah blah
</div>

<div id="post2">
spam2
</div>
{% endblock %}

base.html には次のようなものがあります。

<div id="content-container">
        <div id="section-navigation">
            <ul>
                {% block blog_posts %}
                {% endblock %}
            </ul>
        </div>
        <div id="content">
            {% block content %}{% endblock %}
        </div>
</div>

webapp2 と jinja2 を使用して、これらのブログ投稿を個別のファイルに分割する最良の方法は何ですか?

たとえば、blog1.html は次のようになります。

{% block blog_posts %}
        <!-- links/targest for the side menu to jump to a post -->
        <li><a href="#post1">Post1 - Feb 2012</a></li>
    {% endblock %}

{% block content %}

    <div id="post1">
    spam1 blah blah
    </div>
{% endblock %}

(そして、リンクとブログ投稿がウェブサイト上で正しい順序で表示されるようにしたいと思います)

post2 が post1.html を拡張し、post3 が post2.html を拡張するなどの方法を考えることができますが、もっと広げたいと思います。

「Henry と Kafura は、1981 年に情報フローに基づいたソフトウェア構造メトリックを導入しました[2]。これは、複雑さをファンインとファンアウトの関数として測定します。」

ありがとう

4

3 に答える 3

3

@robert king、あなたのデザインにはデータがテンプレートに直接埋め込まれています。テンプレートには、ビューの青写真のみが含まれている必要があり、メインコードから毎回生成された新しいデータを使用してレンダリングする必要があります。ここでこのプロセスをシミュレートします(投稿タイトルを抽出するためのループの使用と、単一の投稿の表示を示すために編集されました):

import jinja2

# NOTE: in this template there is no data relating to specific posts.
# There are only references to data structures passed in from your main code
page_template = jinja2.Template('''
    <!-- this is a navigation block that should probably be in base.html -->
    {% block blog_posts %}
        <!-- links/targets for the side menu to jump to a post -->
        {% for post in posts %}
          <li><a href="{{ post.url }}">{{ post.title }} 
                                       - {{ post.date }}</a></li>
        {% endfor %}
    {% endblock %}

    <!-- this is a content block that should probably be in page.html -->
    {% block content %}
        <div id="post">
            <h1>{{ current.title }}</h1>
            <h2>{{ current.date }}</h2>
            <p>{{ current.content }}</p>
        </div>
    {% endblock %}
''')

# NOTE your main code would create a data structure such as this 
# list of dictionaries ready to pass in to your template
list_of_posts = [
         { 'url' : '#post1',
          'title' : 'My first post',
          'date' : 'Feb 2012',
          'content' : 'My first post is about Hello World.'},

         { 'url' : '#post2',
          'title' : 'My second post',
          'date' : 'Apr 2012',
          'content' : 'My second post is about Foo Bar.'}
         ]

# Pass in a full list of posts and a variable containing the last
# post in the list, assumed to be the most recent. 
print page_template.render(posts = list_of_posts,
                           current = list_of_posts[-1])

お役に立てれば。

編集「サイトフラグメント-複合ビュー」に関する質問への私の回答も参照してください

于 2012-04-29T07:19:49.570 に答える
3

jinja2 チュートリアルで別のオプションを見つけました。ハンドラーがテンプレートにブログ投稿のファイル名のリストを渡してから、ブログ投稿を含める方が理にかなっていると思います。

include - そのファイルのレンダリングされたコンテンツを現在の名前空間に返します。

{% include 'header.html' %}
    <div ...
{% include 'footer.html' %}

含まれるテンプレートは、デフォルトでアクティブなコンテキストの変数にアクセスできます。インポートおよびインクルードのコンテキスト動作の詳細については、「コンテキストのインポート動作」を参照してください。

Jinja 2.2 以降では、include に ignore missing のマークを付けることができます。この場合、無視するテンプレートが存在しない場合、Jinja はステートメントを無視します。コンテキストありまたはコンテキストなしで組み合わせる場合は、コンテキスト可視性ステートメントの前に配置する必要があります。ここにいくつかの有効な例があります:

{% include "sidebar.html" ignore missing %}
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}

バージョン 2.2 の新機能。

含める前に存在をチェックするテンプレートのリストを提供することもできます。存在する最初のテンプレートが含まれます。ignore missing が指定されている場合、テンプレートが存在しない場合は何もレンダリングせず、そうでない場合は例外が発生します。例:

{% include ['page_detailed.html', 'page.html'] %}
{% include ['special_sidebar.html', 'sidebar.html'] ignore missing %}
于 2012-05-01T01:06:56.863 に答える
1

生の html ファイル (file.read()) を読み取ってテンプレートにデータを渡すと、すべての html がエスケープされました。

{{data}} の代わりに、生の html を許可する {{data|safe}} を使用する必要がありました。

何かのようなもの:

class HomeHandler(BaseHandler):
    def get(self):
        file_names = sorted(os.listdir('blog_posts'))
        html = [open('blog_posts/%s' % fn).read() for fn in file_names]
        templates = {'html': enumerate(html)}
        self.render_template('home.html', **templates)

{% block content %}

    {% for num,data in html %}
        <div id="post{{num}}">
            {{data|safe}}
        </div>
        <br />
        <img src="http://www.sadmuffin.net/screamcute/graphics/graphics-page-divider/page-divider-007.gif" border=0>
        <br />
    {% endfor %}

{% endblock %}

(ディレクトリが静的ディレクトリでないことを確認してください)

于 2012-04-30T02:18:59.827 に答える