4

異なるモデルの2つのクエリセットを1つのリストに結合し、ページ付けを使用して1つのリストとして表示しました。

問題は、リストのオブジェクトが、それらが作成されたモデルに従ってページネーションによって表示されることです。

ここに画像の説明を入力してください

モデルから新しいオブジェクトが作成されたときにリストを修正するにはどうすればよいですか。最近作成されたオブジェクトが別のモデルのものであっても、最近作成されたオブジェクトの後に表示されます。

例はです。ユーザーのホワイトボードとユーザーのコメントの組み合わせクエリセットがあります。新しいホワイトボードのオブジェクトが最近作成され、別のコメントを作成する場合。コメントは、ホワイトボードのオブジェクトの後にページネーションによって表示されますが、別のモデルであったため、ページ付けされた他のすべてのコメントとともに表示されませんでした。

ここに画像の説明を入力してください

私が達成しようとしていることのアイデアをあなたが得ることができることを願っています:)

モジュールの一部

class WhiteBoard(models.Model):

    user = models.ForeignKey(User)
    name = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    picture = models.OneToOneField('Picture',related_name='picture',blank=True,null=True)
    def __unicode__(self):
        return self.name


class Comment(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User)
    body = models.TextField()
    picture = models.ForeignKey(Picture)

views.py

@login_required
def archive(request):
        user = User.objects.get(username=request.user)
        person = Person.objects.get(user=user)
        users = User.objects.filter(pk__in=person.following.all().values_list('user__pk',flat=True))
        picture = whiteboard .objects.filter(user__in=users).order_by("-created")
        comment = Comment.objects.filter(user__in=users).order_by("-created")
        posts= list(chain(picture,comment))
        paginator = Paginator(posts, 5)

        try: page = int(request.GET.get("page", '1'))
        except ValueError: page = 1

        try:
            posts = paginator.page(page)
        except (InvalidPage, EmptyPage):
            posts = paginator.page(paginator.num_pages)
        return render(request,'archive.html',{'picture':picture,'comment':comment,'posts':posts})

archive.html

{% for post in posts.object_list %}

{{post.name }}
<br>
{{post.body}}
{% endfor %}

        <!-- Next/Prev page links  -->
        {% if posts.object_list and posts.paginator.num_pages > 1 %}
        <div class="pagination" style="margin-top: 20px; margin-left: -20px; ">
            <span class="step-links">
                {% if posts.has_previous %}
                        <a href= "?page={{ posts.previous_page_number }}">newer entries &lt;&lt; </a>
                {% endif %}

                    <span class="current">
                    &nbsp;Page {{ posts.number }} of {{ posts.paginator.num_pages }}
                </span>

            {% if posts.has_next %}
                    <a href="?page={{ posts.next_page_number }}"> &gt;&gt; older entries</a>
            {% endif %}
        </span>
    </div>
    {% endif %}

</div>
4

1 に答える 1

8

結合されたクエリセットのリストを、両方が共有する属性で並べ替える必要があります。created

from itertools import chain
...
posts = list(
            sorted(
                chain(picture,comment),
                key=lambda objects: objects.created,
                reverse=True  # Optional
            ))
paginator = Paginator(posts, 5)
...

これがこのトピックに関する同様の質問です

于 2013-03-24T10:45:07.137 に答える