我正在使用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>
我怀疑我想成为一名经理,但我不确定如何写它或在哪里附上它。
提前致谢。
答案 0 :(得分: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)
但这有点骇人听闻。 “干净”的方式不是直接扩展用户模型,而是为用户创建UserProfile 并在那里添加功能。 The docs很好地描述了这一点。
在你的情况下:
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 }}
代码未经测试,但应该有效:)