【问题标题】:Django: How to call management custom command execution from admin interface?Django:如何从管理界面调用管理自定义命令执行?
【发布时间】:2012-08-28 02:53:19
【问题描述】:

参考,executing management commands from code

他们是从 django 管理界面调用此命令执行代码的方法吗?

我有一个自定义命令来定期更新scheduled as cron 的数据库。 cron 工作正常。我需要在需要时从管理界面手动更新数据库。

【问题讨论】:

  • 也许你可以有post_save 信号让你的模型触发命令。

标签: python django command admin


【解决方案1】:

更新:您可以通过在 Python 代码中的任何位置调用函数 call_command('compilemessages') 来运行任何管理命令。注意:从调用者的角度来看,这显然是一个阻塞过程。通过下面的 ajax 示例,您可以获得一种非阻塞/异步的用户体验。根据后端实现,您可以进一步提高此隔离级别。

例子:

from django.core.management import call_command
call_command('compilemessages')

如果任务绑定到当前在管理中查看的对象,一个不错的方法可能是在单击按钮时实现由 ajax 脚本调用的额外视图。额外的视图可以选择包装为 celery 任务,例如

models.py

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>") % self.id
    my_task_init.allow_tags = True
    my_task_init.short_description = _(u"Execute Task")

admin.py

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')

admin_tasks.js

$(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。

【讨论】:

  • 赫德,谢谢你的回答!我的任务是无限的。即使我不需要选择任何项目。但是,您的解决方案将非常适合有界任务。如何覆盖特定模型的模板?我只需要针对特定​​模型的自定义操作。
  • @Babu 如果您只需要选择一个 dom 元素,您可以使用 ModelAdmin 使用自定义 javascript 添加元素
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 2016-04-17
  • 2021-03-09
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2016-03-28
相关资源
最近更新 更多