2016-05-19 8 views
0

私はDjangoでブログを構築していて、自分のテンプレートについて知っています:ブログのホームページは、1つのブログと同じ形式を使ってすべての個々の投稿を表示することができます。要約のために切り捨てられます。Djangoはブログの要約を切り捨てます

だから何私がやったことは、私がホームページテンプレートに含めるしたいブログを表示するためのテンプレートを定義した:

{# blog/post_snippet.html #} 
{% block content %} 
    <h1> {{ post.title }} </h1> 
    {% if post.author %} 
     <h4>By {{ post.author.short_name }}</h4> 
    {% endif %} 

    {% if post.date_published %} 
     <span>On {{ post.date_published }}</span> 
    {% endif %} 
    <p> {{ post.text | safe }} </p> 
{% endblock %} 

そして、これは「すべての記事」ページ内のループのために内部で使用されます:

{% block content %} 
    {% for post in posts %} 
     {% include 'blog/post_snippet.html' %} 
    {% endfor %} 
{% endblock %} 

すべての投稿を表示するとき、テンプレートシステムにブログのテキストを切り捨てるように教えるにはどうすればよいですか? 1つの解決策は、テンプレートコードを複製することですが、私はそれをしたくありません。私も継承を考えていましたが、テンプレートはすでに基本テンプレートから継承していますが、継承するとすぐにすべてのコンテンツが挿入されるため、ブロックの配置を制御することはできません。

私は実際にはかなり混乱しています。ここでベストプラクティスは何ですか?

+0

create 2 snippets ' post_sinppet.html'と 'short_post_snippet.html'です。私が思い出すことのできる他の方法はありません。 –

答えて

2

基本的な考え方は、切り詰められたバージョンのテキストを表示するかどうかを示すパラメータを渡してpost_snippet.htmlを含めることです。

まず、例えば、テキストの切り捨てられたバージョンを返すようにモデルにプロパティを追加します。post_snippet.htmlで

@property 
def truncated_text(): 
    if len(self.text) > 100: 
     return '%s...' % self.text[0:100] 
    else: 
     return self.text 

を、によって{{ post.text | safe }}を置き換える:自宅で

{% if truncated %}{{ post.truncated_text | safe }}{% else %}{{ post.text | safe }}{% endif %} 

ページを表示するには、この方法でpost_snippet.htmlを含める必要があります。

+0

華麗で華麗な答え! – dotslash

関連する問題