ValueError at/message/new/phil_ghil Cannot assign"<SimpleLazyObject:<django.contrib.auth.models.AnonymousUser: Message.user" must be a "User"instance

Viewed 20

Hi I am getting this error over and over again when I press the link which should leed to 'conversation' project.owner.user which starts a new conversation between 2 users. Thanks for your help! Here is my code: 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>
1 Answers

Chances are you are not logged in when you are trying to send a new message. Here are some methods you can make sure that the user is logged-in or not.

  • Use login_required decorator. if you are using function-based views. This will redirect you the the login URL if the user isn't logged in at the time of accessing this view. Read the login_required docs for more detail i.e.
from django.contrib.auth.decorators import login_required

@login_required
def inbox(request):
    user = request.user
  • And if you are using Class based views you can use LoginRequiredMixin. i.e.
from django.contrib.auth.mixins import LoginRequiredMixin

class InboxView(LoginRequiredMixin, View):
    # ....
  • And another way is.
def inbox(request):
    user = request.user
    if not request.user.is_authenticated:
        # show some message or whatever you want to the user. 

Related