1

Story と Category の 2 つの基本モデルがあります。

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 %}

これは、現在表示している記事のリンクされた見出しを表示したくないことを除けば、必要なものを提供してくれます。

これは「除外」フィルターを介して行われると思いますが、これがメソッドとしてカテゴリまたはストーリーモデルに属しているかどうか、またはそれを構築する方法がわかりません。

どんな助けでも大歓迎です!

4

2 に答える 2

1

これを行う:

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>
于 2011-03-04T17:16:49.467 に答える
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 %}
于 2011-03-04T14:20:39.793 に答える