Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能';t使用Django中的最近聊天来组织我的消息_Python_Django - Fatal编程技术网

Python 我能';t使用Django中的最近聊天来组织我的消息

Python 我能';t使用Django中的最近聊天来组织我的消息,python,django,Python,Django,我一直在尝试修复我的邮件,以便显示最近的邮件。我不知道我在代码中哪里出错了 “我的收件箱”中的输出在最上面显示了与新用户新建的对话列表,后面是以前的消息。每当我试图给收件箱中的另一个人发信息时,它不会作为列表中的最新信息出现。我希望能把最近的一次放在榜首 我想我可以使用Send_at了解活动聊天中的最后一个活动对话,但我不知道从哪里开始 这是我的密码: 型号.py from django.db import models from django.core.exceptions import Va

我一直在尝试修复我的邮件,以便显示最近的邮件。我不知道我在代码中哪里出错了

“我的收件箱”中的输出在最上面显示了与新用户新建的对话列表,后面是以前的消息。每当我试图给收件箱中的另一个人发信息时,它不会作为列表中的最新信息出现。我希望能把最近的一次放在榜首

我想我可以使用Send_at了解活动聊天中的最后一个活动对话,但我不知道从哪里开始

这是我的密码:

型号.py

from django.db import models
from django.core.exceptions import ValidationError
from django.utils import timezone
from django.conf import settings

AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')

class Message(models.Model):
    """
    A private direct message.
    """
    content = models.TextField('Content')
    document = models.FileField(upload_to='direct_messages', blank=True, null=True)
    sender = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='sent_dm', verbose_name='Sender'
    )
    recipient = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='received_dm', verbose_name='Recipient'
    )
    sent_at = models.DateTimeField('sent at', auto_now_add=True)
    read_at = models.DateTimeField('read at', null=True, blank=True)

    class Meta:
        ordering = ['-sent_at']

    @property
    def unread(self):
        """
        Returns whether the message was read or not.
        """
        if self.read_at is not None:
            return True

    def __str__(self):
        return self.content

    def save(self, **kwargs):
        """
        Check message sender and recipient and raise error if the are saved.
        Save message when the condition passes.
        """
        if self.sender == self.recipient:
            raise ValidationError("You cant't send messages to yourself!")

        if not self.id:
            self.sent_at = timezone.now()
        super(Message, self).save(**kwargs)

class ChatRoom(models.Model):
    """
    A private char room

    Attributes:
        created_at (datetime): datetime value when chatroom is created.
        recipient (user): user whom the chatroom sends first message.
        sender (user): user who created the chatroom
    """
    sender = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_sender', verbose_name='Sender'
    )
    recipient = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_recipient'
    )
    created_at = models.DateTimeField('sent at', auto_now_add=True)

    class Meta:
        ordering = ['-created_at']
        unique_together = ('sender', 'recipient')
from django.shortcuts import render,redirect
from django.urls import reverse
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.db.models import Q
from django.views.generic import CreateView, RedirectView

from .models import Message, ChatRoom
from .forms import MessageForm
from .services import MessagingService
from users.models import User

class MessageDetailView(CreateView):
    """
    Show a messages, and could send messages.
    """
    model = ChatRoom
    form_class = MessageForm
    template_name = 'direct_messages/direct_messages.html'

    def get_context_data(self, **kwargs):
        """
        Returns conversations based on different conditions.
        1. Fetch message based on chatroom (sender, recipient)
        2. Fetch current conversation of the current user and assign it
        to conversations context value
        3. If current loggedIn user is sender, active_recipient will be
        message recipient otherwise, message sender.
        4. Fetch active conversation for message / chat tab.
        :param kwargs: Description
        :return: Description
        """
        chat_id = self.kwargs.get('pk')

        chatroom = ChatRoom.objects.get(pk=chat_id)

        message = Message.objects.filter(
            sender=chatroom.sender,
            recipient=chatroom.recipient
        ).first()
        if not message:
            message = Message.objects.filter(
                sender=chatroom.sender,
                recipient=chatroom.recipient
            ).first()

        # MessagingService().mark_as_read(message)
        user = self.request.user

        kwargs['active_conversation'] = message
        current_conversations = MessagingService().get_conversations(user=self.request.user)
        kwargs['conversations'] = current_conversations



        if user == message.sender:
            active_recipient = message.recipient
            # kwargs['recipient'] = User.objects.get(username=message.recipient)
        else:
            active_recipient = message.sender
            # kwargs['sender'] = message.sender
        running_conversations = MessagingService().get_active_conversations(user, active_recipient)
        kwargs['running_conversations'] = running_conversations
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        """
        Checks for valid form and submit with updating message object.
        :param form: form object
        :return: Redirect to cuurent message conversation.
        """
        obj = self.get_object()

        if self.request.user == obj.sender:
            recipient = obj.recipient
        else:
            recipient = obj.sender

        message = form.save(commit=False)
        message.sender = self.request.user
        message.recipient = recipient

        message.save()
        messages.success(self.request, 'The message is sent with success!')
        return redirect('direct_messages:user_message', obj.pk)


@method_decorator([login_required], name='dispatch')
class MessageView(RedirectView):

    permanent = False
    query_string = True
    pattern_name = 'direct_messages:user_message'

    def get_redirect_url(self, *args, **kwargs):
        """
         Prepares redirect url when the project owner accept the proposal.
        """
        user = self.request.user
        chatroom = ChatRoom.objects.filter(Q(sender=user) | Q(recipient=user)).first()
        if chatroom:
            return super().get_redirect_url(*args, pk=chatroom.pk)
        messages.warning(self.request, 'You do not have any messages to show.')
        return reverse('direct_messages:list_message')
视图.py

from django.db import models
from django.core.exceptions import ValidationError
from django.utils import timezone
from django.conf import settings

AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')

class Message(models.Model):
    """
    A private direct message.
    """
    content = models.TextField('Content')
    document = models.FileField(upload_to='direct_messages', blank=True, null=True)
    sender = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='sent_dm', verbose_name='Sender'
    )
    recipient = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='received_dm', verbose_name='Recipient'
    )
    sent_at = models.DateTimeField('sent at', auto_now_add=True)
    read_at = models.DateTimeField('read at', null=True, blank=True)

    class Meta:
        ordering = ['-sent_at']

    @property
    def unread(self):
        """
        Returns whether the message was read or not.
        """
        if self.read_at is not None:
            return True

    def __str__(self):
        return self.content

    def save(self, **kwargs):
        """
        Check message sender and recipient and raise error if the are saved.
        Save message when the condition passes.
        """
        if self.sender == self.recipient:
            raise ValidationError("You cant't send messages to yourself!")

        if not self.id:
            self.sent_at = timezone.now()
        super(Message, self).save(**kwargs)

class ChatRoom(models.Model):
    """
    A private char room

    Attributes:
        created_at (datetime): datetime value when chatroom is created.
        recipient (user): user whom the chatroom sends first message.
        sender (user): user who created the chatroom
    """
    sender = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_sender', verbose_name='Sender'
    )
    recipient = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_recipient'
    )
    created_at = models.DateTimeField('sent at', auto_now_add=True)

    class Meta:
        ordering = ['-created_at']
        unique_together = ('sender', 'recipient')
from django.shortcuts import render,redirect
from django.urls import reverse
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.db.models import Q
from django.views.generic import CreateView, RedirectView

from .models import Message, ChatRoom
from .forms import MessageForm
from .services import MessagingService
from users.models import User

class MessageDetailView(CreateView):
    """
    Show a messages, and could send messages.
    """
    model = ChatRoom
    form_class = MessageForm
    template_name = 'direct_messages/direct_messages.html'

    def get_context_data(self, **kwargs):
        """
        Returns conversations based on different conditions.
        1. Fetch message based on chatroom (sender, recipient)
        2. Fetch current conversation of the current user and assign it
        to conversations context value
        3. If current loggedIn user is sender, active_recipient will be
        message recipient otherwise, message sender.
        4. Fetch active conversation for message / chat tab.
        :param kwargs: Description
        :return: Description
        """
        chat_id = self.kwargs.get('pk')

        chatroom = ChatRoom.objects.get(pk=chat_id)

        message = Message.objects.filter(
            sender=chatroom.sender,
            recipient=chatroom.recipient
        ).first()
        if not message:
            message = Message.objects.filter(
                sender=chatroom.sender,
                recipient=chatroom.recipient
            ).first()

        # MessagingService().mark_as_read(message)
        user = self.request.user

        kwargs['active_conversation'] = message
        current_conversations = MessagingService().get_conversations(user=self.request.user)
        kwargs['conversations'] = current_conversations



        if user == message.sender:
            active_recipient = message.recipient
            # kwargs['recipient'] = User.objects.get(username=message.recipient)
        else:
            active_recipient = message.sender
            # kwargs['sender'] = message.sender
        running_conversations = MessagingService().get_active_conversations(user, active_recipient)
        kwargs['running_conversations'] = running_conversations
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        """
        Checks for valid form and submit with updating message object.
        :param form: form object
        :return: Redirect to cuurent message conversation.
        """
        obj = self.get_object()

        if self.request.user == obj.sender:
            recipient = obj.recipient
        else:
            recipient = obj.sender

        message = form.save(commit=False)
        message.sender = self.request.user
        message.recipient = recipient

        message.save()
        messages.success(self.request, 'The message is sent with success!')
        return redirect('direct_messages:user_message', obj.pk)


@method_decorator([login_required], name='dispatch')
class MessageView(RedirectView):

    permanent = False
    query_string = True
    pattern_name = 'direct_messages:user_message'

    def get_redirect_url(self, *args, **kwargs):
        """
         Prepares redirect url when the project owner accept the proposal.
        """
        user = self.request.user
        chatroom = ChatRoom.objects.filter(Q(sender=user) | Q(recipient=user)).first()
        if chatroom:
            return super().get_redirect_url(*args, pk=chatroom.pk)
        messages.warning(self.request, 'You do not have any messages to show.')
        return reverse('direct_messages:list_message')
direct_messages.html

{% extends 'base.html' %}

{% load static %}

{% load crispy_forms_tags %}

{% load humanize %}

{% block styles %}
    <link rel="stylesheet" href="{% static 'assets/css/message.css' %}">
    <link rel="stylesheet" href="{% static 'css/profile.css' %}" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
{% endblock %}

{% block content %}
<section id="main">
  <div class="container">
    <div class="messaging">
        <div class="inbox_msg">
            <div class="inbox_people">
                <div class="headind_srch">
                    <div class="recent_heading">
                        <h4>Recent</h4>
                    </div>
                </div>
                    <div class="inbox_chat">
                        {% for chat in conversations %}
                            <div class="chat_list {% if forloop.counter == 1 %} active_chat {% endif %} ">
                                <a style="display: block;
                                   height: 100%;
                                   width: 100%;
                                   text-decoration: none;"
                                   href="{% url 'direct_messages:user_message' chat.pk %}" class="fill-div">
                                    <div class="chat_people" >
                                        <div class="chat_img" >
                                            <img src="{{ MEDIA_URL }}{{ chat.recipient.profile_photo.url }}" alt="sunil">
                                        </div>
                                        <div class="chat_ib" >
                                            <h5>{{ chat.recipient }}</h5>
                                        </div>
                                    </div>
                                </a>
                            </div>
                        {% endfor %}
                    </div>
                </div>

                <div class="mesgs">
                    <div class="msg_history">
                        {% for conversation in running_conversations %}
                            {% if user == conversation.sender %}
                                <div class="outgoing_msg">
                                    <div class="sent_msg">
                                        <p>{{ conversation.content | safe }}</p>
                                        {% if conversation.document %}
                                        <a type="button" style="color:#FFFFFF; background-color:#A9A9A9; border: 3pt lightgrey" class="badge badge-secondary" target="_blank" href="{{ MEDIA_URL }}{{ conversation.document.url | safe }}" >See attachment</a>
                                        {% endif %}
                                        <span class="time_date">{{ conversation.sent_at | naturaltime }}</span>
                                    </div>
                                </div>
                            {% else %}
                                <div class="incoming_msg">
                                    <div class="incoming_msg_img">
                                        <img src="{{ MEDIA_URL }}{{ conversation.sender.profile_photo.url }}" alt="{{ conversation.recipient.username }}">
                                    </div>
                                    <div class="received_msg">
                                        <div class="received_withd_msg">
                                            <p>{{ conversation.content | safe }}</p>
                                            {% if conversation.document %}
                                            <a type="button" style="color:#FFFFFF; background-color:#A9A9A9; border: 3pt lightgrey" class="badge badge-secondary" target="_blank" href="{{ MEDIA_URL }}{{ conversation.document.url | safe }}" >See attachment</a>
                                            {% endif %}
                                            <span class="time_date">{{ conversation.sent_at | naturaltime }}</span>
                                        </div>
                                    </div>
                                </div>
                            {% endif %}
                        {% endfor %}
                    </div>
                    <div class="type_msg">
                        <div class="input_msg_write">
                            <form method="post" novalidate enctype="multipart/form-data">
                                {% csrf_token %}
                                {% for field in form %}
                                    {{ field }}
{#                                    {% if field.help_text %}#}
{#                                        {{ field.help_text }}#}
{#                                    {% endif %}#}
{#                                    {% for error in field.errors %}#}
{#                                        {{ error }}#}
{#                                    {% endfor %}#}
                                {% endfor %}
                                <button class="msg_send_btn" type="submit"> <i class="fa fa-paper-plane-o" style="font-size:15px" aria-hidden="true"> </i> </button>
                            </form>
                        </div>
                    </div>
                </div>

        </div>
    </div>
  </div>
</section>
{% endblock %}
{%extends'base.html%}
{%load static%}
{%load crispy_forms_tags%}
{%load humanize%}
{%block styles%}
{%endblock%}
{%block content%}
最近的
{%用于对话中的聊天%}
{%endfor%}
{运行_conversations%}
{%if user==conversation.sender%}
{{conversation.content | safe}}

{%if conversation.document%} {%endif%} {{conversation.sent|naturaltime} {%else%} {{conversation.content | safe}}

{%if conversation.document%} {%endif%} {{conversation.sent|naturaltime} {%endif%} {%endfor%} {%csrf_令牌%} {%形式的字段为%} {{field}} {{{%if field.help_text%}} {{{field.help_text}}} {{{%endif%}}} {{{%表示字段中的错误。错误%}} {{{error}}{{error}} {{{%endfor%}}} {%endfor%} {%endblock%}
如果您想组织聊天,则应更新您的模型,如:

class ChatRoom(models.Model):
    """
    A private char room

    Attributes:
        created_at (datetime): datetime value when chatroom is created.
        recipient (user): user whom the chatroom sends first message.
        sender (user): user who created the chatroom
    """
    sender = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_sender', verbose_name='Sender'
    )
    recipient = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_recipient'
    )
    created_at = models.DateTimeField('sent at', auto_now_add=True)
    last_update = models.DateTimeField('last message',auto_now=False)
    class Meta:
        ordering = ['-created_at']
        unique_together = ('sender', 'recipient')
然后,当发件人或用户发送新消息时,您必须更新
last\u update
字段,并根据
last\u update
时间安排聊天列表,如:

chats = ChatRoom.objects.all().order_by('-last_update')
我希望这就是你想要的

这是开始新对话的代码,我正在开发一个自由职业者市场,因此只有当雇主接受自由职业者的建议时,才会进行新的对话

class ProposalAcceptView(RedirectView):
    """
    Aceept a proposal.
    """
    permanent = False
    query_string = True
    pattern_name = 'jobs:job_detail'

    def get_redirect_url(self, *args, **kwargs):
        job = get_object_or_404(Job, pk=kwargs['pk'])
        job.freelancer = User.objects.get(username=kwargs.get('username'))
        job.status = 'working'
        job.save()

        # Create message opening
        is_chatroom = False
        try:
            chatroom = ChatRoom.objects.get(sender=self.request.user, recipient=job.freelancer)
            is_chatroom = True
        except:
            pass

        if not is_chatroom:
            try:
                chatroom = ChatRoom.objects.get(sender=job.freelancer, recipient=self.request.user)
            except:
                pass

        if not is_chatroom:
            chatroom = ChatRoom.objects.create(sender=self.request.user, recipient=job.freelancer)

        print('is chatroom', is_chatroom)
        print('chat roo', chatroom)

        print('chat room created....')

        MessagingService().send_message(
            sender=self.request.user,
            recipient=job.freelancer,
            message="""
            Hi {username},

            Your proposal is accepted.

            Project details: <a href='{url}'>{job}</a>
            """.format(username=job.freelancer.username,
                       url=reverse("jobs:job_detail", kwargs={"pk": job.pk}),
                       job=job.job_title
                       )
        )

        messages.success(
            self.request, 'User : {} is assiged to your project'.format(kwargs.get('username'))
        )

        return super().get_redirect_url(*args, pk=kwargs['pk'])
class ProposalAcceptView(重定向视图):
"""
接受一项提议。
"""
永久=假
查询字符串=True
模式\名称='作业:作业\详细信息'
def get_redirect_url(self、*args、**kwargs):
作业=获取对象或404(作业,pk=kwargs['pk'])
job.freeloper=User.objects.get(用户名=kwargs.get('username'))
job.status='working'
job.save()
#创建消息打开
聊天室=假吗
尝试:
聊天室=聊天室.objects.get(发送方=self.request.user,接收方=job.freegorer)
聊天室是真的吗
除:
通过
如果不是聊天室:
尝试:
聊天室=聊天室.objects.get(发送方=job.freegorer,接收方=self.request.user)
除:
通过
如果不是聊天室:
聊天室=聊天室.objects.create(发送方=self.request.user,接收方=job.freegorer)
打印(“是聊天室”,是聊天室)
打印('聊天室',聊天室)
打印('已创建聊天室…')
MessagingService()。发送消息(
发件人=self.request.user,
收件人=job.freegor,
message=”“”
你好{username},
你的建议被接受了。
项目详情:
“”格式(用户名=job.freegorer.username,
url=reverse(“作业:作业\详细信息”,kwargs={“pk”:job.pk}),
job=job.job\u title
)
)
成功(
self.request,“用户:{}被分配到您的项目”。格式(kwargs.get('username'))
)
return super().get_redirect_url(*args,pk=kwargs['pk'])

如果您想组织聊天,则应更新您的模型,如:

class ChatRoom(models.Model):
    """
    A private char room

    Attributes:
        created_at (datetime): datetime value when chatroom is created.
        recipient (user): user whom the chatroom sends first message.
        sender (user): user who created the chatroom
    """
    sender = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_sender', verbose_name='Sender'
    )
    recipient = models.ForeignKey(
        AUTH_USER_MODEL, on_delete=models.CASCADE,
        related_name='chatroom_recipient'
    )
    created_at = models.DateTimeField('sent at', auto_now_add=True)
    last_update = models.DateTimeField('last message',auto_now=False)
    class Meta:
        ordering = ['-created_at']
        unique_together = ('sender', 'recipient')
然后,当新消息从发件人或用户收到时,您必须更新
last\u update
字段并安排聊天列表