Object_list не показывает правильные данные в шаблоне - PullRequest
0 голосов
/ 09 сентября 2018

У меня странная проблема в шаблоне Django. Это шаблон для отображения списка статей, и для каждого из них я показываю список ключевых слов, которые я назвал ключевыми понятиями.

Самое странное, что вместо списка ключевых понятий показан список статей, в которых используется это ключевое понятие.

Ниже схема E / R, модель и шаблон моего проекта: enter image description here

Models.py

class KeyConceptModel(models.Model):
    concept_text = models.CharField(max_length=50)

    def __str__(self):
        return self.concept_text

    def get_absolute_url(self):
        return reverse("keyconceptManuscriptusView", kwargs={"pk": self.pk})

    class Meta: 
        verbose_name = "Concetto chiave"
        verbose_name_plural = "Concetti chiave"  

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" 

Views.py

class ListPostGDV(ListView):
    model = PostModel
    template_name = "manuscriptus_home.html"

Template

{% for posts in object_list %}
  <div id="news" class="container">
    <div class="row">
      <img class="img-fluid" src="{% static 'manuscriptus/img/demo_img.png' %}" alt="Header image">
    </div>
    <div class="row">
      <div class="col-3">
        <div class="row">
          <small class="text-muted">Pubblicato il <strong>{{ posts.post_publishing_date|date }}</strong></small>
        </div>
        <div class="row">
          {% for keyword in object_list.all %}
              <p>{{ keyword }}</p>
          {% endfor %}
        </div>
      </div>
      <div class="col-9">
        <div class="row">
          <p class="h3"><a href="{{ posts.get_absolute_url }}">{{ posts.post_title }}</a></p>
        </div>
        <div class="row">
          <p class="h5">{{ posts.post_short_description|safe|linebreaks }}</p>
        </div>
      </div>
    </div>
  </div>
{% empty %}
  <div id="news" class="container">
    <h1>Go to the admin panel and create your first post!</h1>
  </div>
{% endfor %}

NB. Я использовал общий вид детализации

1 Ответ

0 голосов
/ 09 сентября 2018

В вашем шаблоне вы пишете:

<!-- this will iterate again over the <i>same</i> list -->
{% for keyword in <b>object_list.all</b> %}
    <p>{{ keyword }}</p>
{% endfor %}

Но здесь object_list это ваши QuerySet статей.Тот факт, что вы вызываете .all(), только означает, что цикл for будет, таким образом, снова повторяться по всем PostModel с (ну, .all() используется, чтобы явно указать, что вы не выполняете фильтрацию).

Если вы хотите перебрать post_keyconcept, вам нужно вместо этого позвонить posts.post_keyconcept.all:

{% for keyword in <b>posts.post_keyconcept.all</b> %}
    <p>{{ keyword }}</p>
{% endfor %}

, так как вы хотите отобразить key_concepts всех postsлучше использовать .prefetch_related(..) в ListView, чтобы keywords выбиралось в постоянном количестве запросов, поэтому:

class ListPostGDV(ListView):
    model = PostModel
    queryset = PostModel.objects<b>.prefetch_related('post_keyconcept')</b>

    # ...

Примечание : обычноназвания моделей единичны и без суффикса Model, поэтому Post вместо PostModel и KeyConcept вместо KeyConceptModel.

Примечание : поскольку вы итерируете по object_list (во внешнем цикле), элемент представляет собой отдельный пост, поэтому я советую назвать его post вместо posts, поскольку это только в противном случаевносит путаницу.

Примечание : все атрибуты начинаются с префикса post_, который немного избыточен.Это также предотвращает использование утки, набирающей , когда, например, две модели имеют атрибут name, и вы хотите, чтобы функция могла обрабатывать обе.Поэтому я советую удалить префикс post_ атрибутов.

...