2016-11-17 107 views
3

对不起,我还没有代码示例,因为我试图解决我是否可以完成的任务。没有模型的Django管理视图

我在写一个Django应用程序来管理Celery任务。我正在使用django-celery-beat进行计划任务,但我想要一个类似的管理界面来启动临时任务,并使用表单接受参数。我希望它与IP坐在管理部分,因为这是所有的应用程序;目前没有其他意见。

ModelAdmin的所有文档都基于模型的自定义字段,但我不认为此对象需要存储在模型中,因为它们是暂态的,数据将由Celery任务保存。根据我从文档中了解的内容,您无法注册自定义管理视图,而无需将其用于模型。

我在寻找的是一种自定义视图,它与模型无关,因此我可以在管理部分为这些管理命令创建自定义窗体。

想法我有:

  • Meta
  • managed = False创建一个虚拟模型创建一个真正的模型,只是从来没有访问自定义内ModelForm
  • 只需创建一个视图,手动将该网址添加到管理部分。这可能是最简单的方法,但我一直在避免,因为我不确定将其绑定到管理员的身份验证系统或在自动生成其他所有内容时在管理页面中显示链接需要什么。

任何指针赞赏。我会测试所有合理的答案,并选择最好的答案作为正确答案,但会赞成所有答案。

编辑:@dejavu_cmd_delt提出了Flower的好建议,但我想尽可能将它全部集成在admin部分。

回答

1

我放弃了:)它似乎太多的反模式,所以我放弃了这个想法,并创建了一个基于django_celery_beat中特定任务的简单自定义模型。这使我可以回顾ScheduledTask模型的任务检测方法,并使用pre_save挂钩向Celery发出创建任务。然后我创建了一个单独的Django应用程序来包含它并与主要的django_celery_beat一起安装。

这里的模型在一份副本,它是利用以往的任何一个:

class AdhocTask(models.Model): 

    id = models.AutoField(primary_key=True) 
    description = models.CharField(blank=True, max_length=255) 
    regtask = models.CharField(null=True, max_length=200) 
    args = models.TextField(blank=True, default='[]', 
          help_text='JSON encoded positional args' 
          ) 
    kwargs = models.TextField(blank=True, default='{}', 
          help_text='JSON encoded keyword args' 
          ) 


# SendAdhocTask is my management command that parses the AdhocTask instance 
# and sends the task to a Celery task queue. 
signals.pre_save.connect(SendAdhocTask, sender=AdhocTask)