Skip to content

Instantly share code, notes, and snippets.

@twolfson
Last active October 22, 2023 19:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twolfson/e5a1acf2d0119c548c9bd927c09961ad to your computer and use it in GitHub Desktop.
Save twolfson/e5a1acf2d0119c548c9bd927c09961ad to your computer and use it in GitHub Desktop.
Django messages as AJAX endpoint
from django.urls import path
from . import views
urlpatterns = [
path("messages/", views.messages),
]
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django.contrib.messages import get_messages
@require_http_methods(["GET"])
def messages(request):
# https://github.com/jgerigmeyer/jquery-django-messages-ui/blob/2.0.2/messages_ui/middleware.py#L45-L55
# https://docs.djangoproject.com/en/4.2/ref/contrib/messages/#displaying-messages
message_list = [
{
"message": message.message,
"level_tag": message.level_tag,
"extra_tags": message.extra_tags,
}
for message in get_messages(request)
]
return JsonResponse({"messages": message_list})
import { ToastContainer, toast } from "react-toastify";
import { useEffect } from "react";
import { useQuery } from "react-query";
export const useMessages = (options) => {
return useQuery(
["messages"],
() =>
// Doesn't handle error responses (e.g. 404 or 500 (non-JSON)) well
fetch("/messages/").then((res) => res.json()),
options
);
};
export const NotificationContainer = () => {
const { error: messagesError, data: messagesData } = useMessages();
useEffect(() => {
if (messagesError) {
throw messagesError;
}
if (messagesData) {
messagesData.messages.forEach((message) => {
toast(message.message, { type: message.level_tag });
});
}
}, [messagesError, messagesData]);
return <ToastContainer />;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment