diff --git a/tests/sitemaps_tests/test_http.py b/tests/sitemaps_tests/test_http.py
index 3a820e140f..af787ff41f 100644
--- a/tests/sitemaps_tests/test_http.py
+++ b/tests/sitemaps_tests/test_http.py
@@ -352,3 +352,48 @@ class HTTPSitemapTests(SitemapTestsBase):
 
 """
         self.assertXMLEqual(response.content.decode(), expected_content)
+
+    def test_callable_sitemod_partial(self):
+        """
+        Not all items have `lastmod`. Therefore the `Last-Modified` header
+        is not set by the detail sitemap view.
+        """
+        index_response = self.client.get('/callable-lastmod-partial/index.xml')
+        sitemap_response = self.client.get('/callable-lastmod-partial/sitemap.xml')
+        self.assertNotIn('Last-Modified', index_response)
+        self.assertNotIn('Last-Modified', sitemap_response)
+        expected_content_index = """
+        
+        http://example.com/simple/sitemap-callable-lastmod.xml
+        
+        """
+        expected_content_sitemap = """
+        
+        http://example.com/location/2013-03-13http://example.com/location/
+        
+        """
+        self.assertXMLEqual(index_response.content.decode(), expected_content_index)
+        self.assertXMLEqual(sitemap_response.content.decode(), expected_content_sitemap)
+
+    def test_callable_sitemod_full(self):
+        """
+        All items in the sitemap have `lastmod`. The `Last-Modified` header
+        is set for the detail sitemap view. The index view does not (currently)
+        set the `Last-Modified` header.
+        """
+        index_response = self.client.get('/callable-lastmod-full/index.xml')
+        sitemap_response = self.client.get('/callable-lastmod-full/sitemap.xml')
+        self.assertNotIn('Last-Modified', index_response)
+        self.assertEqual(sitemap_response.headers['Last-Modified'], 'Thu, 13 Mar 2014 10:00:00 GMT')
+        expected_content_index = """
+        
+        http://example.com/simple/sitemap-callable-lastmod.xml
+        
+        """
+        expected_content_sitemap = """
+        
+        http://example.com/location/2013-03-13http://example.com/location/2014-03-13
+        
+        """
+        self.assertXMLEqual(index_response.content.decode(), expected_content_index)
+        self.assertXMLEqual(sitemap_response.content.decode(), expected_content_sitemap)
diff --git a/tests/sitemaps_tests/urls/http.py b/tests/sitemaps_tests/urls/http.py
index e4cba4c42f..936f346e41 100644
--- a/tests/sitemaps_tests/urls/http.py
+++ b/tests/sitemaps_tests/urls/http.py
@@ -81,6 +81,35 @@ class TimezoneSiteMap(SimpleSitemap):
     lastmod = datetime(2013, 3, 13, 10, 0, 0, tzinfo=timezone.get_fixed_timezone(-300))
 
 
+class CallableLastmodPartialSitemap(Sitemap):
+    """Not all items have `lastmod`."""
+    location = '/location/'
+
+    def items(self):
+        o1 = TestModel()
+        o1.lastmod = datetime(2013, 3, 13, 10, 0, 0)
+        o2 = TestModel()
+        return [o1, o2]
+
+    def lastmod(self, obj):
+        return obj.lastmod
+
+
+class CallableLastmodFullSitemap(Sitemap):
+    """All items have `lastmod`."""
+    location = '/location/'
+
+    def items(self):
+        o1 = TestModel()
+        o1.lastmod = datetime(2013, 3, 13, 10, 0, 0)
+        o2 = TestModel()
+        o2.lastmod = datetime(2014, 3, 13, 10, 0, 0)
+        return [o1, o2]
+
+    def lastmod(self, obj):
+        return obj.lastmod
+
+
 def testmodelview(request, id):
     return HttpResponse()
 
@@ -158,6 +187,14 @@ generic_sitemaps_lastmod = {
     }),
 }
 
+callable_lastmod_partial_sitemap = {
+    'callable-lastmod': CallableLastmodPartialSitemap,
+}
+
+callable_lastmod_full_sitemap = {
+    'callable-lastmod': CallableLastmodFullSitemap,
+}
+
 urlpatterns = [
     path('simple/index.xml', views.index, {'sitemaps': simple_sitemaps}),
     path('simple-paged/index.xml', views.index, {'sitemaps': simple_sitemaps_paged}),
@@ -246,6 +283,10 @@ urlpatterns = [
     path(
         'sitemap-without-entries/sitemap.xml', views.sitemap,
         {'sitemaps': {}}, name='django.contrib.sitemaps.views.sitemap'),
+    path('callable-lastmod-partial/index.xml', views.index, {'sitemaps': callable_lastmod_partial_sitemap}),
+    path('callable-lastmod-partial/sitemap.xml', views.sitemap, {'sitemaps': callable_lastmod_partial_sitemap}),
+    path('callable-lastmod-full/index.xml', views.index, {'sitemaps': callable_lastmod_full_sitemap}),
+    path('callable-lastmod-full/sitemap.xml', views.sitemap, {'sitemaps': callable_lastmod_full_sitemap}),
 ]
 
 urlpatterns += i18n_patterns(