From 03e0ab5c64d4bc09c6932268b29efcc789a0f7af Mon Sep 17 00:00:00 2001
From: Adam Johnson <me@adamj.eu>
Date: Tue, 27 Aug 2024 19:14:50 +0100
Subject: [PATCH] [5.1.x] Refs #34609 -- Fixed deprecation warning stack level
 in format_html().

Co-authored-by: Simon Charette <charette.s@gmail.com>

Backport of 2b71b2c8dcd40f2604310bb3914077320035b399 from main.
---
 django/utils/html.py           | 3 ++-
 tests/utils_tests/test_html.py | 5 +++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/django/utils/html.py b/django/utils/html.py
index 154c820d34..e5ad5646fa 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -129,10 +129,11 @@ def format_html(format_string, *args, **kwargs):
     """
     if not (args or kwargs):
         # RemovedInDjango60Warning: when the deprecation ends, replace with:
-        # raise ValueError("args or kwargs must be provided.")
+        # raise TypeError("args or kwargs must be provided.")
         warnings.warn(
             "Calling format_html() without passing args or kwargs is deprecated.",
             RemovedInDjango60Warning,
+            stacklevel=2,
         )
     args_safe = map(conditional_escape, args)
     kwargs_safe = {k: conditional_escape(v) for (k, v) in kwargs.items()}
diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py
index 82dbd58f12..10ba621dd5 100644
--- a/tests/utils_tests/test_html.py
+++ b/tests/utils_tests/test_html.py
@@ -70,10 +70,11 @@ class TestUtilsHtml(SimpleTestCase):
         msg = "Calling format_html() without passing args or kwargs is deprecated."
         # RemovedInDjango60Warning: when the deprecation ends, replace with:
         # msg = "args or kwargs must be provided."
-        # with self.assertRaisesMessage(ValueError, msg):
-        with self.assertWarnsMessage(RemovedInDjango60Warning, msg):
+        # with self.assertRaisesMessage(TypeError, msg):
+        with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
             name = "Adam"
             self.assertEqual(format_html(f"<i>{name}</i>"), "<i>Adam</i>")
+        self.assertEqual(ctx.filename, __file__)
 
     def test_linebreaks(self):
         items = (