labels: Blog Django created: 2014-04-06T00:00 place: Starobilsk, Ukraine comments: true
ping_google()
allows to notify google that your sitemaps were changed and need to reindex. This snippet shows how to add ping google button to item edit page on django admin site.
Edit admin/change_form.html
:
cp .env/lib/python2.7/site-packages/django/contrib/admin/templates/admin/change_form.html myproject/templates/admin/
--- a/myproject/templates/admin/change_form.html
+++ b/myproject/templates/admin/change_form.html
@@ -28,6 +28,9 @@
{% block object-tools %}
{% if change %}{% if not is_popup %}
<ul class="object-tools">
+ {% for button in buttons %}
+ <li><a href="{{ button.0 }}/">{{ button.1 }}</a></li>
+ {% endfor %}
{% block object-tools-items %}
Edit admin.py
file:
from django.contrib import admin, messages
from django.contrib.sitemaps import ping_google
from django.http import HttpResponseRedirect
class ButtonableModelAdmin(admin.ModelAdmin):
"""
A subclass of this admin will let you add buttons (like history) in the
change view of an entry.
More: https://djangosnippets.org/snippets/1016/
admin/change_form.html template is modified.
"""
buttons = []
def change_view(self, request, object_id, extra_context={}):
extra_context['buttons'] = self.buttons
return super(ButtonableModelAdmin, self).change_view(
request=request, object_id=object_id, extra_context=extra_context)
def button_view_dispatcher(self, request, object_id, command):
obj = self.model._default_manager.get(pk=object_id)
return getattr(self, command)(request, [obj]) \
or HttpResponseRedirect(request.META['HTTP_REFERER'])
def get_urls(self):
from django.conf.urls import patterns, url
from django.utils.functional import update_wrapper
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.module_name
return patterns('',
*(url(r'^(\d+)/(%s)/$' % but[0], wrap(self.button_view_dispatcher)) for but in self.buttons)
) + super(ButtonableModelAdmin, self).get_urls()
class MyModelAdmin(ButtonableModelAdmin):
def _ping_google(self, request, queryset):
try:
ping_google()
messages.success(
request,
'Sitemaps were submitted.')
except Exception:
messages.warning(
request,
'Sitemaps were not submitted.')
_ping_google.short_description = 'Ping google'
buttons = [(_ping_google.func_name, _ping_google.short_description)]
The ping_google()
command only works if you have registered your site with Google Webmaster Tools.
Links: