我想要一个与故事相关联的文章列表,这些文章将在其故事专属的行上呈现。目前,模板仅在三个单独的行中返回上一个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>
答案 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>