Babu Babu - 2 months ago 9
Python Question

Django: How to call management custom command execution from admin interface?

Referring to, executing management commands from code,

Is their a way to call this command execution code from the django admin interface?

I've a custom command to do some periodic update of database which has been scheduled as cron. The cron is working fine. I need to update the database manually from the admin interface whenever needed.


update: you can run any management command simply by calling the function call_command('compilemessages') from anywhere within your python code.

If the task is bound to the object currently viewed in the admin, a nice way might be to implement an extra view called by an ajax script when clicking a button. The extra view could optionally be wrapped as a celery task, e.g.

class Foo(models.Model):
    # fields...

    def my_task_init(self):
        return mark_safe("<img class='loading' src='/static/img/loading.gif' alt='loading' style='display:none;' /><a data-identifier='task_%i' class='task'><img src='/static/img/process.png' style='cursor:pointer;' /></a>") %
    my_task_init.allow_tags = True
    my_task_init.short_description = _(u"Execute Task")

class FooAdmin(admin.ModelAdmin):
    list_display = ['other_field', 'my_task_init']

    class Media:
        js = (

    def get_urls(self):
        urls = super(FooAdmin, self).get_urls()
        extra_urls = patterns('',
            (r'^my-task/$', self.admin_site.admin_view(self.parse_view))
        return extra_urls + urls

    # optionally decorated by celery
    def task_view(self, request):
        if not request.is_ajax():
            raise Http404
        task_id = request.GET.get('task_id')
        # your logic
        return HttpResponse('Success')


$(document).ready(function (){
       var image = $(this).find('img'),
           loading = $(this).parent().find('.loading'),
           task_id = $(this).data('identifier').replace('task_', '');
           type: "GET",
           data: ({'task_id': task_id}),
           url: "/admin/app/model/my-task/",
           beforeSend: function() {
           statusCode: {
               200: function() {
                   image.attr('src', '/static/img/success.png');
               404: function() {
                   image.attr('src', '/static/img/error.png');
               500: function() {
                   image.attr('src', '/static/img/error.png');

If you're trying to initiate an unbound task you could just override a template element or add some html.