我有两个基本模型,故事和类别:
class Category(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField()
...
class Story(models.Model):
headline = models.CharField(max_length=50)
slug = models.SlugField()
categories = models.ManyToManyField(Category)
...
我对故事细节的看法:
from django.views.generic import date_based, list_detail
from solo.apps.news.models import Story
def story_detail(request, slug, year, month, day):
"""
Displays story detail. If user is superuser, view will display
unpublished story detail for previewing purposes.
"""
stories = None
if request.user.is_superuser:
stories = Story.objects.all()
else:
stories = Story.objects.live()
return date_based.object_detail(
request,
year=year,
month=month,
day=day,
date_field='pub_date',
slug=slug,
queryset=stories,
template_object_name = 'story',
)
在给定故事对象的视图上 - 我正在使用通用详细视图 - 我想通过应用于当前故事的类别显示与当前故事相关的故事列表。
以下是我目前在故事详细信息模板中执行此操作的方式:
{% for category in story.category.all %}
<ul id="related_stories">
{% for story in category.story_set.all|slice:"5" %}
<li><a href="{{ story.get_absolute_url }}" title="{{ story.headline }}">{{ story.headline }}</a></li>
{% endfor %}
</ul>
{% endfor %}
这为我提供了我需要的东西,除了我想避免显示我正在查看的故事的链接标题。
我相信这是通过“排除”过滤器完成的,但我不确定它是否属于类别或故事模型作为方法,或者如何构建它。
任何帮助将不胜感激!
答案 0 :(得分:0)
如果当前迭代的故事是原始故事,您可以检查模板:
{% for category in story.category.all %}
<ul id="related_stories">
{% for substory in category.story_set.all|slice:"5" %}
{% if substory != story %}
<li><a href="{{ substory.get_absolute_url }}" title="{{ substory.headline }}">{{ story.headline }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
您要求将其放入模型方法中:
class Story(models.Model):
...
def get_categories_with_stories(self):
categories = self.category.all()
for category in categories:
category.stories = category.story_set.exclude(id=self.id)[:5]
return categories
这并不能解决您的昂贵查询问题,但这不是问题的一部分。
{% for category in story.get_categories_with_stories %}
<ul id="related_stories">
{% for substory in category.stories %}
<li><a href="{{ substory.get_absolute_url }}" title="{{ substory.headline }}">{{ story.headline }}</a></li>
{% endfor %}
</ul>
{% endfor %}
答案 1 :(得分:0)
这样做:
class Story(models.Model):
...
@property
def related_story_set(self):
category_id_list = self.category.values_list("id", flat=True)
return Story.objects.filter(category__id__in=category_id_list).exclude(id=self.id)
然后你可以在模板中执行此操作:
<ul id="related_stories">
{% for related_story in story.related_story_set.all|slice:"5" %}
<li><a href="{{ related_story.get_absolute_url }}" title="{{ related_story.headline }}">{{ related_story.headline }}</a></li>
{% endfor %}
</ul>