2016-05-19 1 views
0

Я создаю блог в Django и кое-что понял о своих шаблонах: домашняя страница блога может отображать все отдельные сообщения, используя тот же формат, что и один блог, с той лишь разницей, что текст будет быть усеченным для сводки.Django truncate blog summary puzzle

Так что я сделал определить шаблон для отображения блога, который я бы включить в шаблон главной страницы:

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

Проблема при отображении всех сообщений, как сообщить системе шаблонов об усечении текста блога? Одним из решений является дублирование кода шаблона, но я не хочу этого делать. Я также думал о наследовании, но мои шаблоны уже наследуются от базового шаблона, плюс я думаю, что наследование сразу введет весь контент, и поэтому я не смогу контролировать размещение блоков ??

Я совершенно смущен, на самом деле. Какая здесь самая лучшая практика?

+0

Просто используйте create 2 snippets ' post_sinppet.html' и 'short_post_snippet.html'. Другого способа я не помню. –

ответ

2

Основная идея состоит в том, чтобы включить post_snippet.html, передав параметр, чтобы указать, хотите ли вы усеченную версию текста или нет.

Во-первых, добавить свойство к вашей модели, которая будет возвращать усеченный вариант текста, например:

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

В post_snippet.html заменить {{ post.text | safe }} по:

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

В доме странице, вам просто нужно включить post_snippet.html следующим образом:

{% include 'blog/post_snippet.html' with truncated=True %} 
+0

Блестящий, блестящий ответ! – dotslash

Смежные вопросы