将 query_set 的列表呈现为 html 模板上的行

Rendering list of query_set as row on html template

我希望将标记为与故事关联的文章列表呈现在其故事独占的行上。目前,模板 returns 仅在三个单独的行中显示最后一个故事中的文章。编写和理解的代码是:

多篇文章可以属于一个故事。 /models.py

class Story(models.Model):
    title = models.CharField(max_length=200, default= "")
    description = models.TextField()
    publication_date = models.DateTimeField()

class Article(models.Model):
    feed = models.ForeignKey(Feed)
    title = models.CharField(max_length=200)
    url = models.URLField()
    publication_date = models.DateTimeField()
    story = models.ManyToManyField(Story, default=None, blank=True)

使用查询,获取所有 story_ids 的列表。如果 story_id_lst 中的条目等于文章中的 story_id,则将该故事附加到行列表。

/views.py

def articles_list(request):
    articles = Article.objects.all()
    story_id_lst = articles.values_list('story').distinct()
    for entry in story_id_lst:
      rows = articles.filter(story=entry)

运行 shell returns 三个列表中的代码,一个是空的,一个是所有文章都与故事 1 匹配,另一个是所有文章都与故事 2 匹配。我相信问题出在以下代码中。

/views.py

return render(request, 'news/articles_list.html', {'rows': rows})

/articles_list.html

<div class="container" style="background-color: #DCDCDC; border-radius: 25px;">
<div class="row">
{% for row in rows %}
<div class="col-md-12">
    {% for entry in row %}
    <div class="container-fuild">
        <div class="col-md-4" >
            <h2>{{entry.title}}</h2>
            <div>
                <p><a href="{{entry.url}}" target="_blank" class="btn btn-primary">View Details</a></p>
            </div>
        </div>
    </div>
    {% endfor %}
</div>
{% endfor %}
</div>
</div>

我看到你对你的问题进行了大量修改..

如果一篇文章可以属于一个故事,那么文章应该有一个故事的外键(不是多对多关系):

class Story(models.Model):
    title = models.CharField(max_length=200, default= "")

class Article(models.Model):
    story = models.ForeignKey(Story, default=None, blank=True)
    title = models.CharField(max_length=200)
    url = models.URLField()

那么视图可以写成:

def articles_list(request):
    articles = Article.objects.all()
    return render(request, 'news/articles_list.html', {'articles': articles})

和模板:

{% regroup articles by story as story_list %}

<ul>
{% for story in story_list %}
    <li>{{ story.grouper }}
    <ul>
        {% for article in story.list %}
            <li><a href="{{ article.url }}">{{ article.title }}</a></li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>