Django: How to call management custom command execution from admin interface?
指从代码中执行管理命令,
他们是否可以从django管理界面调用此命令执行代码?
我有一个自定义命令来定期更新数据库,它被安排为cron。克罗恩工作得很好。我需要随时从管理界面手动更新数据库。
更新:只需从python代码中的任何地方调用函数
例子:
1 2 | from django.core.management import call_command call_command('compilemessages') |
如果任务绑定到当前在管理中查看的对象,一个好的方法可能是在单击按钮时实现一个由Ajax脚本调用的额外视图。额外的视图可以作为芹菜任务包装,例如
型号.py
1 2 3 4 5 6 7 | 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;' /><img src='/static/img/process.png' style='cursor:pointer;' />") % self.id my_task_init.allow_tags = True my_task_init.short_description = _(u"Execute Task") |
号
行政副总裁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class FooAdmin(admin.ModelAdmin): list_display = ['other_field', 'my_task_init'] class Media: js = ( 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js', '/static/js/admin_tasks.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') |
管理任务.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | $(document).ready(function (){ $('.task').click(function(){ var image = $(this).find('img'), loading = $(this).parent().find('.loading'), task_id = $(this).data('identifier').replace('task_', ''); $.ajax({ type:"GET", data: ({'task_id': task_id}), url:"/admin/app/model/my-task/", beforeSend: function() { image.hide(); loading.show(); }, statusCode: { 200: function() { loading.hide(); image.attr('src', '/static/img/success.png'); image.show(); }, 404: function() { loading.hide(); image.attr('src', '/static/img/error.png'); image.show(); }, 500: function() { loading.hide(); image.attr('src', '/static/img/error.png'); image.show(); } } }); }); }); |
。
如果您试图启动一个未绑定的任务,您可以重写一个模板元素或添加一些HTML。