Выделенный пост в шаблонах Django - PullRequest
0 голосов
/ 31 августа 2018

Я создал эту модель:

class PostModel(models.Model):
    post_title = models.CharField(max_length=70)
    post_short_description = models.TextField(max_length=200)
    post_contents = models.TextField()
    post_publishing_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    post_author = models.ForeignKey(AuthorModel, on_delete=models.CASCADE)
    post_keyconcept = models.ManyToManyField(KeyConceptModel)
    slug = models.SlugField(verbose_name="Slug", unique="True")
    post_highlighted = models.BooleanField(default=False)

    def __str__(self):
        return self.post_title

    def get_absolute_url(self):
        return reverse("singlepostManuscriptusView", kwargs={"slug": self.slug})

    class Meta: 
        verbose_name = "Articolo"
        verbose_name_plural = "Articoli" 

Я хочу использовать post_highlighted для вставки в div только статьи или статей, которые имеют ответ true .

Как мне настроить "для cicle"?

Здесь есть цикл для показа списка постов:

{% for posts in object_list %}

<div id="bloghome" class="container">
  <h1><a href="{{ posts.get_absolute_url }}">{{ posts.post_title }}</a></h1>
  <p>{{ posts.post_short_description|safe|linebreaks }}</p>
  <p>Pubblicato il <strong>{{ posts.post_publishing_date|date }}</strong></p>
  <h5>Keywords:</h5>
    {% for keyword in object_list.all %}
      <button type="button" class="btn btn-outline-warning btn-sm">{{ keyword }}</button>
    {% endfor %}
</div>
<hr>

{% empty %}

  <h1>Go to the admin panel and create your first post!</h1>

{% endfor %}

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете сделать это с помощью простого оператора if

{% for posts in object_list %}
  {% if posts.post_highlighted %}
    <div id="bloghome" class="container">
      <h1><a href="{{ posts.get_absolute_url }}">{{ posts.post_title }}</a></h1>
      <p>{{ posts.post_short_description|safe|linebreaks }}</p>
      <p>Pubblicato il <strong>{{ posts.post_publishing_date|date }}</strong></p>
      <h5>Keywords:</h5>
        {% for keyword in object_list.all %}
          <button type="button" class="btn btn-outline-warning btn-sm">{{ keyword }}</button>
        {% endfor %}
    </div>
    <hr>
  {% endif %}
{% endfor %}
0 голосов
/ 31 августа 2018

Не делайте этого в шаблоне, вы можете изменить queryset из ListView (хорошо на основе object_list Я предполагаю, что вы используете ListView или хотя бы связанный класс):

class MyPostView(ListView):

    model = PostModel
    <b>queryset = PostModel.objects.filter(post_highlighted=True)</b>

    # ...

Теперь object_list будет содержать только PostModel объектов с post_highlighted = True.

Если вы используете другой вид, где вы сами создаете object_list, вы можете написать его следующим образом:

object_list = PostModel.objects.filter(post_highlighted=True)

так что, пока object_list содержит подсвеченные PostModel объекты, у нас все хорошо.

Преимущество выполнения этого на уровне queryset состоит в том, что мы запросим в базе данных на выделенные PostModel объекты. Таким образом мы выполняем запрос:

SELECT postmodel.*
FROM postmodel
<b>WHERE post_highlighted = TRUE</b>

Базы данных, как правило, могут эффективно искать такие записи, и, кроме того, мы избегаем фильтрации на уровне Django / Python, который обычно на несколько медленнее.

Представьте, если выделены два сообщения из ста. Затем, не фильтруя на уровне базы данных, вы передаете данные всех сотен постов в Django, выполняете десериализацию, зацикливаетесь на них и почти мгновенно отбрасываете 98 невыделенных. Это много работы даром.

Примечание : обычно модели не имеют суффикса Model. Советую переименовать модель в Post.

...