django - 在 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')
- 如何自动将消息类(模型)中的“作者”字段分配给编写消息的用户 ID?现在我需要自己从我数据库中的(非真实)用户中选择“作者”,但这是错误的,必须根据谁编写消息来自动选择。或者,让我们说写此消息的帐户是谁。
- 在 MessageRecipient 类(模型)中,我必须自己选择收件人,并且我不仅可以在必须到达消息的特定聊天组的参与者中进行选择,还可以从我的数据库中的所有其他用户中进行选择,他们甚至不在其中特别聊天。如何限制收件人的范围,以便我只能选择特定消息(查看消息字段)到达的聊天中的那些人?
解决方案
好吧,您可以像这样创建一个名为Message
then addsender
和receiver
fields 的模型:
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>
推荐阅读
- javascript - 使用 css 位置更改元素的位置:绝对
- c - 从 c 文件写入 h 文件,然后在 C 中写入另一个 h 文件
- python - 如何删除“!” 除了最后一个句子?
- python - 如何将循环的值传递给函数?
- python - 将 noughts and crosss 游戏转换为 4 x 4 网格
- android - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String okhttp3.ResponseBody.string()”
- python - 4阶张量对称部分的Sympy计算
- html - 如何将元素定位在其底部边框的外部?
- entity-framework - 测试实体框架迁移中的架构更改
- c# - 无法加载 MSBuild 任务所需的程序集