首页 > 解决方案 > 在 Django 中创建消息(聊天)功能

问题描述

我为项目用户之间的消息传递创建了模型。我的消息模型:

class Chat(models.Model):
    id = models.CharField(_('id'), primary_key=True, default=hex_uuid, editable=False, 
                         max_length=32)
    chat_participants = models.ManyToManyField(User, blank=True)

    class Meta:
        db_table = 'chat'
        verbose_name_plural = 'chats'


class Message(models.Model):
    id = models.CharField(_('id'), primary_key=True, default=hex_uuid, editable=False, 
                         max_length=32)
    chat = models.ForeignKey(Chat, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField(_('text'), max_length=1500, null=True, blank=True)
    send_datetime = models.DateTimeField(auto_now_add=True, blank=True)

    class Meta:
        db_table = 'message'
        verbose_name_plural = 'messages'


class MessageRecipient(models.Model):
    id = models.CharField(_('id'), primary_key=True, default=hex_uuid, editable=False, 
                         max_length=32)
    message = models.ForeignKey(Message, on_delete=models.CASCADE)
    recipient = models.ForeignKey(User, on_delete=models.CASCADE)
    is_seen = models.BooleanField(_('is_seen'), default=False)

    class Meta:
        db_table = 'message_recipient'
        verbose_name_plural = 'message recipients'
        unique_together = ('message', 'recipient')
  1. 如何自动将消息类(模型)中的“作者”字段分配给编写消息的用户 ID?现在我需要自己从我数据库中的(非真实)用户中选择“作者”,但这是错误的,必须根据谁编写消息来自动选择。或者,让我们说写此消息的帐户是谁。
  2. 在 MessageRecipient 类(模型)中,我必须自己选择收件人,并且我不仅可以在必须到达消息的特定聊天组的参与者中进行选择,还可以从我的数据库中的所有其他用户中进行选择,他们甚至不在其中特别聊天。如何限制收件人的范围,以便我只能选择特定消息(查看消息字段)到达的聊天中的那些人?

标签: djangochatmessaging

解决方案


好吧,您可以像这样创建一个名为Messagethen addsenderreceiverfields 的模型:

class Message(models.Model):
    text = models.CharField(max_lenght=500)
    sender = models.ForeignKey(User, on_delete=models.SET_NULL)
    receiver = models.ForeignKey(User, on_delete=models.SET_NULL)

然后在您的视图中,您将获得所有消息并处理表单验证(表单将调用 1 个字段text,仅此而已):

def messages(request, pk):
    sender = request.user
    receiver = User.objects.get( # query the user for a receiver )
    sent_messages = Message.objects.filter(sender=sender, receiver=receiver)
    received_messages = Message.objects.filter(sender=receiver, receiver=sender)
    messages = sent_messages.union(received_messages)
    if request.method == 'POST'
        form = MessageForm(request.POST)
        if form.is_valid():
            message = form.save(commit=False)
            message.sender = request.user
            message.receiver = User.objects.get( # query the user for a receiver )
            message.save()
            return redirect('messages', pk=receiver.pk)
    else:
        form = MessageForm()
    return render(redirect, 'messages_template.html', {'receiver': receiver,
                                                       'messages': messages,
                                                       'form': form})

然后在模板中:

messages_template.html

{% for message in messages %}
    {{ message.sender}} says: {{ message.text }}
{% endfor %}

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" value="Send"></button>
<form>

推荐阅读