gpt4 book ai didi

python - Django:如何从管理界面调用管理自定义命令执行?

转载 作者:太空狗 更新时间:2023-10-30 00:36:52 24 4
gpt4 key购买 nike

引用,executing management commands from code ,

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

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

最佳答案

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

例子:

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

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

模型.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();
}
}
});
});
});

如果您尝试启动未绑定(bind)的任务,您可以覆盖模板元素或添加一些 html。

关于python - Django:如何从管理界面调用管理自定义命令执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12246665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com