0

Django 1.4を使用して、最小限のユーザー間メッセージングアプリを作成しています。ユーザーが受信した未読メッセージをテンプレートから簡単に取得したい。私のモデルは次のようになります。

from django.contrib.auth.models import User

class Message(models.Model):
    sender = models.ForeignKey(User, related_name='messages_sent')
    receiver = models.ForeignKey(User, related_name='messages_received')
    read = models.BooleanField(default=False)

これで、ユーザーがから受信したメッセージに簡単にアクセスできますuser.messages_received。ただし、このクエリセットをフィルタリングして、未読メッセージに簡単にすばやくアクセスできるようにしたいと思います。クエリセットはいつでもフィルタリングできることはわかっていますがuser.messages_received.filter(read=False)、テンプレートで直接取得したいのですが、おそらく次のようになります。

<a href="{% url inbox %}"> Inbox ({{ user.unread_messages.count }})</a>

マネージャーを作りたいのではないかと思いますが、書き方や付け方がわかりません。

前もって感謝します。

4

1 に答える 1

1

私の頭に浮かぶこれを達成するための2つの方法があります。

まず、カスタム関数を使用してユーザーモデルを拡張できます。

from django.contrib.auth.models import User

def unread_messages(self):
    return self.messages_received.filter(read=False)
User.add_to_class('unread_messages', unread_messages)

しかし、それは少しハッキーです。「クリーンな」方法は、ユーザーモデルを直接拡張するのではなく、ユーザーのUserProfileを作成し、そこに関数を追加することです。ドキュメントはこれを非常によく説明しています。

あなたの場合:

models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    def unread_messages(self):
        return self.user.messages_received.filter(read=False)

settings.py

AUTH_PROFILE_MODULE = 'appname.UserProfile'

レンプレート

{{ user.get_profile.unread_messages.count }}

コードはテストされていませんが、機能するはずです:)

于 2012-04-04T09:53:01.510 に答える