将query_set的列表呈现为html模板

时间:2017-02-26 19:52:31

标签: python html django templates views

我想要一个与故事相关联的文章列表,这些文章将在其故事专属的行上呈现。目前,模板仅在三个单独的行中返回上一个Story中的文章。编写和理解的代码是:

许多文章都属于一个故事。 /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中运行该代码会返回三个列表,一个为空,一个包含与故事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>

1 个答案:

答案 0 :(得分:0)

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

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

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>