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. 不过,我想过滤这个查询集,以便以一种简单的方式快速访问未读消息。我知道我总是可以过滤 queryset user.messages_received.filter(read=False),但我想直接在模板中获取它们,可能像这样:

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

我怀疑我想做一个经理,但我不知道如何写或在哪里附加它。

提前致谢。

4

1 回答 1

1

我想到了两种方法来实现这一点。

首先,您可以使用自定义函数扩展用户模型。

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)

但这有点骇人听闻。“干净”的方式不是直接扩展 User 模型,而是为您的用户创建一个 UserProfile并在那里添加函数。文档很好地描述了这一点。

在你的情况下:

模型.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)

设置.py

AUTH_PROFILE_MODULE = 'appname.UserProfile'

模板

{{ user.get_profile.unread_messages.count }}

该代码未经测试,但应该可以工作:)

于 2012-04-04T09:53:01.510 回答