Django,使用UserModel创建自定义消息收件箱问题

时间:2013-06-23 11:08:30

标签: django

我正在尝试使用自定义UserModel创建一个简单的邮件收件箱应用,而不使用插件,因为它允许我自由地自定义它。

我创建了下面的模型,我弄清楚如何向收件人显示邮件,但我无法弄清楚如何创建一个函数来显示用户发送的回复邮件。

例如,我发了一条消息。您回复了以下消息:如果回复继续,我如何显示回复的消息,包括原始消息和所有其他消息。

此示例显示我如何阅读用户发送的单条消息。

模型

class Message(models.Model):
    user = models.ForeignKey(User)
    recipient = models.ForeignKey(User)
    subject = models.CharField(max_length=100)
    body = models.CharField(max_length=1000)
    read = models.BooleanField(default=False)
    trash = models.BooleanField(default=False)
    sentmessage = models.BooleanField(default=False)

视图

def Messages(request,id):
    user = User.objects.get(user=request.user)
    message = Message.objects.filter(pk=id,user=user)
    render (request,'message.html'{'message':message})

模板

{{message.user}}
{{message.subject}}
{{message.body}}

1 个答案:

答案 0 :(得分:2)

您可以在ForeignKey模型上为'self'创建Message字段,可以将其称为in_response_to。并且,每次有响应时,创建一个新对象,并将FK字段分配给此回复发送到的消息。您必须优雅地处理对同一消息的多个响应。

class Message(models.Model):
    user = models.ForeignKey(User, related_name='sender')
    recipient = models.ForeignKey(User, related_name='recipient')
    subject = models.CharField(max_length=100)
    body = models.CharField(max_length=1000)
    read = models.BooleanField(default=False)
    trash = models.BooleanField(default=False)
    sentmessage = models.BooleanField(default=False)
    in_response_to = models.ForeignKey('self', null=True, blank=True)

您可能还想添加createdupdated时间戳,以跟踪发送的邮件的顺序。

此外,请注意,related_name上的FK需要User,否则django会抛出错误

现在,在检索时,获取fk对象直到它为Noneblank

在最简单的形式中,您可以编写模型方法:

class Message(models.Model):
    #attributes here

    def get_all_in_reponse_to(self):
        obj = self.in_response_to
        response = ''
        while obj:
            response += obj.body
            obj = obj.in_response_to
        return response.

更简单的方法(就像你建议的那样):

class Message(models.Model):
    #attributes here

    def get_all_in_reponse_to(self):
        response_objects = self.in_response_to.message_set.order_by('-created')
        for obj in response_object:
            response += obj.body
        return response.

我会让你弄清楚格式等很简单