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
. если вы используете представления на основе функций. Это перенаправит вас на URLlogin
, если пользователь не вошел в систему во время доступа к этому представлению. Прочтите документацию 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.