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:
parent
b3520da9ac
commit
d0257a1558
|
@ -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")
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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}),
|
||||||
)
|
)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
==============
|
==============
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue