8

コードからの管理コマンドの実行を参照して、

django管理インターフェースからこのコマンド実行コードを呼び出す方法はありますか?

cron としてスケジュールされているデータベースの定期的な更新を行うためのカスタム コマンドがあります。cron は正常に動作しています。必要に応じて、管理インターフェイスからデータベースを手動で更新する必要があります。

4

1 に答える 1

23

更新:call_command('compilemessages') Python コード内の任意の場所から関数を呼び出すだけで、任意の管理コマンドを実行できます。注: これは明らかに、呼び出し元の観点からはブロックプロセスです。以下の ajax の例を使用すると、非ブロッキング/非同期のユーザー エクスペリエンスを実現できます。バックエンドの実装によっては、この分離レベルをさらに進めることができます。

例:

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

タスクが管理画面で現在表示されているオブジェクトにバインドされている場合、ボタンをクリックしたときに ajax スクリプトによって呼び出される追加のビューを実装するのが良い方法かもしれません。追加のビューは、必要に応じてセロリ タスクとしてラップできます。

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 を追加するだけです。

于 2012-09-03T11:43:10.640 に答える