ValueError at/message/new/phil_ghil Не удалось присвоить "<SimpleLazyObject:<django.contrib.auth.models.AnonymousUser: Message.user" должен быть экземпляром "User".

Привет Я получаю эту ошибку снова и снова, когда я нажимаю на ссылку, которая должна привести к 'conversation' project.owner.user, которая начинает новый разговор между двумя пользователями. Спасибо за помощь! Вот мой код: directs/models.py

class Message(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name="from_user")
    reciepient = models.ForeignKey(User, on_delete=models.CASCADE, related_name="to_user")
    body = models.TextField(null=True)
    date = models.DateTimeField(auto_now_add=True)
    is_read = models.BooleanField(default=False)

    def sender_message(from_user, to_user, body):
        sender_message = Message(
            user=from_user,
            sender = from_user,
            reciepient = to_user,
            body = body,
            is_read = True
            )
        sender_message.save()
    
        reciepient_message = Message(
            user=to_user,
            sender = from_user,
            reciepient = from_user,
            body = body,
            is_read = True
            )
        reciepient_message.save()
        return sender_message

    def get_message(user):
        users = []
        messages = Message.objects.filter(user=user).values('reciepient').annotate(last=Max('date')).order_by('-last')
        for message in messages:
            users.append({
                'user': User.objects.get(pk=message['reciepient']),
                'last': message['last'],
                'unread': Message.objects.filter(user=user, reciepient__pk=message['reciepient'], is_read=False).count()
            })
        return users

directs/views.py

def inbox(request):
    user = request.user
    messages = Message.get_message(user=request.user)
    active_direct = None
    directs = None
    profile = get_object_or_404(Profile, user=user)

    if messages:
        message = messages[0]
        active_direct = message['user'].username
        directs = Message.objects.filter(user=request.user, reciepient=message['user'])
        directs.update(is_read=True)

        for message in messages:
            if message['user'].username == active_direct:
                message['unread'] = 0
    context = {
        'directs':directs,
        'messages': messages,
        'active_direct': active_direct,
        'profile': profile,
    }
    return render(request, 'directs/direct.html', context)

def NewConversation(request, username):
    from_user = request.user
    body = ''
    try:
        to_user = User.objects.get(username=username)
    except Exception as e:
        return redirect('search-users')
    if from_user != to_user:
        Message.sender_message(from_user, to_user, body)
    return redirect('inbox')

directs/urls.py

urlpatterns = [
    path('new/<username>', views.NewConversation, name="conversation"),
    path('inbox/', views.inbox, name="inbox"),
]

projects/single-project.html

        <div>
          <a href="{% url 'conversation' project.owner.user %}">Send message</a>
        </div>

Вполне вероятно, что вы не вошли в систему, когда пытаетесь отправить новое сообщение. Вот несколько методов, с помощью которых вы можете убедиться, что пользователь вошел в систему или нет.

  • Используйте декоратор login_required. если вы используете представления на основе функций. Это перенаправит вас на URL login, если пользователь не вошел в систему во время доступа к этому представлению. Прочтите документацию login_required docs для более подробной информации. т.е.
from django.contrib.auth.decorators import login_required

@login_required
def inbox(request):
    user = request.user
  • А если вы используете представления на основе классов, вы можете использовать LoginRequiredMixin. т.е.
from django.contrib.auth.mixins import LoginRequiredMixin

class InboxView(LoginRequiredMixin, View):
    # ....
  • А другой способ -
  • .
def inbox(request):
    user = request.user
    if not request.user.is_authenticated:
        # show some message or whatever you want to the user. 

Вернуться на верх