Fixed #14041 -- Added ability to override the template of the sitemaps views. Thanks, julien.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14883 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2010-12-12 22:56:29 +00:00
parent b3520da9ac
commit d0257a1558
6 changed files with 92 additions and 6 deletions

View File

@ -1,3 +1,4 @@
import os
from datetime import date from datetime import date
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -16,12 +17,40 @@ class SitemapTests(TestCase):
def setUp(self): def setUp(self):
self.old_USE_L10N = settings.USE_L10N self.old_USE_L10N = settings.USE_L10N
self.old_Site_meta_installed = Site._meta.installed self.old_Site_meta_installed = Site._meta.installed
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates'),
)
# Create a user that will double as sitemap content # Create a user that will double as sitemap content
User.objects.create_user('testuser', 'test@example.com', 's3krit') User.objects.create_user('testuser', 'test@example.com', 's3krit')
def tearDown(self): def tearDown(self):
settings.USE_L10N = self.old_USE_L10N settings.USE_L10N = self.old_USE_L10N
Site._meta.installed = self.old_Site_meta_installed Site._meta.installed = self.old_Site_meta_installed
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_simple_sitemap_index(self):
"A simple sitemap index can be rendered"
# Retrieve the sitemap.
response = self.client.get('/simple/index.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>http://example.com/simple/sitemap-simple.xml</loc></sitemap>
</sitemapindex>
""")
def test_simple_sitemap_custom_index(self):
"A simple sitemap index can be rendered with a custom template"
# Retrieve the sitemap.
response = self.client.get('/simple/custom-index.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a customised template -->
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>http://example.com/simple/sitemap-simple.xml</loc></sitemap>
</sitemapindex>
""")
def test_simple_sitemap(self): def test_simple_sitemap(self):
"A simple sitemap can be rendered" "A simple sitemap can be rendered"
@ -32,6 +61,18 @@ class SitemapTests(TestCase):
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://example.com/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url> <url><loc>http://example.com/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
</urlset> </urlset>
""" % date.today().strftime('%Y-%m-%d'))
def test_simple_custom_sitemap(self):
"A simple sitemap can be rendered with a custom template"
# Retrieve the sitemap.
response = self.client.get('/simple/custom-sitemap.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a customised template -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://example.com/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
</urlset>
""" % date.today().strftime('%Y-%m-%d')) """ % date.today().strftime('%Y-%m-%d'))
@skipUnless(settings.USE_I18N, "Internationalization is not enabled") @skipUnless(settings.USE_I18N, "Internationalization is not enabled")

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a customised template -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% spaceless %}
{% for url in urlset %}
<url>
<loc>{{ url.location }}</loc>
{% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
{% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
{% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
</url>
{% endfor %}
{% endspaceless %}
</urlset>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a customised template -->
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for location in sitemaps %}<sitemap><loc>{{ location }}</loc></sitemap>{% endfor %}
</sitemapindex>

View File

@ -27,7 +27,11 @@ flatpage_sitemaps = {
} }
urlpatterns = patterns('django.contrib.sitemaps.views', urlpatterns = patterns('django.contrib.sitemaps.views',
(r'^simple/index\.xml$', 'index', {'sitemaps': simple_sitemaps}),
(r'^simple/custom-index\.xml$', 'index', {'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap_index.xml'}),
(r'^simple/sitemap-(?P<section>.+)\.xml$', 'sitemap', {'sitemaps': simple_sitemaps}),
(r'^simple/sitemap\.xml$', 'sitemap', {'sitemaps': simple_sitemaps}), (r'^simple/sitemap\.xml$', 'sitemap', {'sitemaps': simple_sitemaps}),
(r'^simple/custom-sitemap\.xml$', 'sitemap', {'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap.xml'}),
(r'^generic/sitemap\.xml$', 'sitemap', {'sitemaps': generic_sitemaps}), (r'^generic/sitemap\.xml$', 'sitemap', {'sitemaps': generic_sitemaps}),
(r'^flatpages/sitemap\.xml$', 'sitemap', {'sitemaps': flatpage_sitemaps}), (r'^flatpages/sitemap\.xml$', 'sitemap', {'sitemaps': flatpage_sitemaps}),
) )

View File

@ -5,7 +5,7 @@ from django.core import urlresolvers
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
from django.core.paginator import EmptyPage, PageNotAnInteger from django.core.paginator import EmptyPage, PageNotAnInteger
def index(request, sitemaps): def index(request, sitemaps, template_name='sitemap_index.xml'):
current_site = get_current_site(request) current_site = get_current_site(request)
sites = [] sites = []
protocol = request.is_secure() and 'https' or 'http' protocol = request.is_secure() and 'https' or 'http'
@ -20,10 +20,10 @@ def index(request, sitemaps):
if pages > 1: if pages > 1:
for page in range(2, pages+1): for page in range(2, pages+1):
sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page)) sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page))
xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites}) xml = loader.render_to_string(template_name, {'sitemaps': sites})
return HttpResponse(xml, mimetype='application/xml') return HttpResponse(xml, mimetype='application/xml')
def sitemap(request, sitemaps, section=None): def sitemap(request, sitemaps, section=None, template_name='sitemap.xml'):
maps, urls = [], [] maps, urls = [], []
if section is not None: if section is not None:
if section not in sitemaps: if section not in sitemaps:
@ -43,5 +43,5 @@ def sitemap(request, sitemaps, section=None):
raise Http404("Page %s empty" % page) raise Http404("Page %s empty" % page)
except PageNotAnInteger: except PageNotAnInteger:
raise Http404("No page '%s'" % page) raise Http404("No page '%s'" % page)
xml = smart_str(loader.render_to_string('sitemap.xml', {'urlset': urls})) xml = smart_str(loader.render_to_string(template_name, {'urlset': urls}))
return HttpResponse(xml, mimetype='application/xml') return HttpResponse(xml, mimetype='application/xml')

View File

@ -279,8 +279,10 @@ references individual sitemap files, one per each section defined in your
Here's what the relevant URLconf lines would look like for the example above:: Here's what the relevant URLconf lines would look like for the example above::
(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}), urlpatterns = patterns('django.contrib.sitemaps.views',
(r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}), (r'^sitemap\.xml$', 'index', {'sitemaps': sitemaps}),
(r'^sitemap-(?P<section>.+)\.xml$', 'sitemap', {'sitemaps': sitemaps}),
)
This will automatically generate a :file:`sitemap.xml` file that references both This will automatically generate a :file:`sitemap.xml` file that references both
:file:`sitemap-flatpages.xml` and :file:`sitemap-blog.xml`. The :file:`sitemap-flatpages.xml` and :file:`sitemap-blog.xml`. The
@ -291,6 +293,26 @@ You should create an index file if one of your sitemaps has more than 50,000
URLs. In this case, Django will automatically paginate the sitemap, and the URLs. In this case, Django will automatically paginate the sitemap, and the
index will reflect that. index will reflect that.
.. versionadded:: 1.3
Template customization
======================
If you wish to use a different template for each sitemap or sitemap index available on your site,
you may specify it by passing a `template_name` parameter to the `sitemap` and `index` views via
the URLconf::
urlpatterns = patterns('django.contrib.sitemaps.views',
(r'^custom-sitemap\.xml$', 'index', {
'sitemaps': sitemaps,
'template_name': 'custom_sitemap.html'
}),
(r'^custom-sitemap-(?P<section>.+)\.xml$', 'sitemap', {
'sitemaps': sitemaps,
'template_name': 'custom_sitemap.html'
}),
)
Pinging Google Pinging Google
============== ==============