Now I am trying to build messaging functionality into my webapp, where businesses can message buyers and users can message sellers.
The messaging functionality works fine, but the problem is, debug django messages show up such as Message from john to steve in Lululemon
, I don’t even know where they are coming from, which view is causing them.
Maybe because I am using Django Messages Framework, when I call the messages.add_message function or use the contrib.messages context processor in my views, Django adds these messages to the request context. These messages are then being displayed in my base template wherever I have included the {% if messages %} block.
Now I don’t know how to get rid of these messages for this view.
My models.py:
class Message(models.Model):
sender = models.ForeignKey(CustomUser, related_name='sent_messages', on_delete=models.CASCADE)
recipient = models.ForeignKey(CustomUser, related_name='received_messages', on_delete=models.CASCADE)
business = models.ForeignKey(Business, related_name='messages', on_delete=models.CASCADE, null=True)
content = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
is_read = models.BooleanField(default=False)
def __str__(self):
return f'Message from {self.sender} to {self.recipient} in {self.business}'
@property
def sender_is_business(self):
return self.sender.business.exists()
@property
def recipient_is_business(self):
return self.recipient.business.exists()
My views.py:
@login_required
def message_seller(request, business_slug):
business = get_object_or_404(Business, business_slug=business_slug)
if request.method == 'POST':
content = request.POST.get('content')
if content:
Message.objects.create(
sender=request.user,
recipient=business.seller,
business=business,
content=content
)
return redirect('message_seller', business_slug=business.business_slug)
# Mark messages as read for the current user and business
Message.objects.filter(recipient=request.user, business=business).update(is_read=True)
messages = Message.objects.filter(
Q(sender=request.user, recipient=business.seller) |
Q(sender=business.seller, recipient=request.user)
).filter(business=business).order_by('timestamp')
individual_business_message_counter = Message.objects.filter(recipient=request.user, business=business, is_read=False).count()
context = {
'business': business,
'messages': messages,
'individual_business_message_counter': individual_business_message_counter,
}
return render(request, 'business/message.html', context)
@login_required
def message_buyer(request, username):
user = get_object_or_404(CustomUser, username=username)
business = Business.objects.filter(seller=request.user).first()
if not business:
return redirect('user_messages')
if request.method == 'POST':
content = request.POST.get('content')
if content:
Message.objects.create(
sender=request.user,
recipient=user,
business=business,
content=content
)
return redirect('message_buyer', username=user.username)
# Mark messages as read for the current user and buyer
Message.objects.filter(recipient=request.user, sender=user).update(is_read=True)
messages = Message.objects.filter(
Q(sender=request.user, recipient=user) |
Q(sender=user, recipient=request.user)
).filter(business=business).order_by('timestamp')
context = {
'user': user,
'messages': messages,
}
return render(request, 'business/message_buyer.html', context)
@login_required
def user_messages_view(request):
businesses = Business.objects.filter(
Q(messages__sender=request.user) | Q(messages__recipient=request.user)
).distinct()
user_messages = []
latest_messages = []
for business in businesses:
if request.user == business.seller:
# Query messages for business with other users
messages = Message.objects.filter(
Q(sender=business.seller) | Q(recipient=business.seller)
).filter(business=business).order_by('-timestamp')
for user, chat in itertools.groupby(messages, lambda m: m.recipient if m.sender == request.user else m.sender):
last_message = next(chat)
unread_count = Message.objects.filter(recipient=business.seller, sender=user, business=business, is_read=False).count()
user_messages.append({
'business': business,
'last_message': last_message,
'user': user,
'unread_count': unread_count,
})
latest_messages.append(last_message)
else:
last_message = Message.objects.filter(
Q(sender=request.user, recipient=business.seller) |
Q(sender=business.seller, recipient=request.user)
).filter(business=business).order_by('-timestamp').first()
unread_count = Message.objects.filter(recipient=request.user, sender=business.seller, is_read=False).count()
user_messages.append({
'business': business,
'last_message': last_message,
'unread_count': unread_count,
})
latest_messages.append(last_message)
# Sort user_messages by the latest message timestamp
user_messages = sorted(user_messages, key=lambda um: um['last_message'].timestamp, reverse=True)
unread_message_counter = sum(msg['unread_count'] for msg in user_messages)
if request.method == 'POST':
business_slug = request.POST.get('business_slug')
business = get_object_or_404(Business, business_slug=business_slug)
content = request.POST.get('content')
if content:
if request.user == business.seller:
# Business sending message to user
username = request.POST.get('username')
if username:
recipient = get_object_or_404(CustomUser, username=username)
Message.objects.create(
sender=request.user,
recipient=recipient,
business=business,
content=content
)
return redirect(f'{request.path}?business_slug={business.business_slug}&username={recipient.username}')
else:
# User sending message to business
Message.objects.create(
sender=request.user,
recipient=business.seller,
business=business,
content=content
)
return redirect(f'{request.path}?business_slug={business.business_slug}')
selected_business = None
selected_user = None
messages = []
if 'business_slug' in request.GET:
business_slug = request.GET.get('business_slug')
selected_business = get_object_or_404(Business, business_slug=business_slug)
if request.user == selected_business.seller and 'username' in request.GET:
# Query messages for selected_business with selected_user
username = request.GET.get('username')
if username:
selected_user = get_object_or_404(CustomUser, username=username)
messages = Message.objects.filter(
Q(sender=selected_user, recipient=selected_business.seller) |
Q(sender=selected_business.seller, recipient=selected_user)
).filter(business=selected_business).order_by('timestamp')
else:
messages = Message.objects.filter(
Q(sender=request.user, recipient=selected_business.seller) |
Q(sender=selected_business.seller, recipient=request.user)
).filter(business=selected_business).order_by('timestamp')
Message.objects.filter(recipient=request.user, business=selected_business).update(is_read=True)
context = {
'user_messages': user_messages,
'selected_business': selected_business,
'selected_user': selected_user,
'messages': messages,
'unread_message_counter': unread_message_counter,
}
return render(request, 'business/user_messages.html', context)
My urls.py:
path('message/<slug:business_slug>/', views.message_seller, name='message_seller'),
path('message/buyer/<str:username>/', views.message_buyer, name='message_buyer'),
path('messages/', views.user_messages_view, name='user_messages'),
path('messages/<slug:business_slug>/', views.user_messages_view, name='user_messages_with_slug'),
I even tried using a context_processor to get rid of django messages for this view only, but did not work:
def custom_messages(request):
excluded_paths = ['/messages/', '/messages/']
if request.path not in excluded_paths:
return {'messages': get_messages(request)}
return {'messages': []}