【问题标题】:Creating messaging (chatting) functions in Django在 Django 中创建消息(聊天)功能
【发布时间】:2021-01-16 20:44:05
【问题描述】:

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

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 类(模型)中,我必须自己选择收件人,我不仅可以从必须到达的特定聊天组的参与者中选择,还可以从我的数据库中的所有其他用户中选择,甚至不在那个特定的聊天中。如何限制收件人的范围,以便我只能选择特定消息(查看消息字段)到达的聊天中的那些人?

【问题讨论】:

  • 您通常在创建消息的视图中分配用户。
  • 正如@WillemVanOnsem 所指出的,这些模型的相应视图和表单在这里看起来更受关注。发布这些代码,我们可以更好地了解您的需求!

标签: django chat messaging


【解决方案1】:

您可以创建一个名为 Message 的模型,然后向其中添加 sender 和 receiver 字段,如下所示:

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)

然后在您的 view 中,您将获得所有消息并处理 form 验证(form 将有一个名为 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>

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多