对不起,我还没有一个代码样本,因为我正在努力弄清楚如果我在想什么,甚至可以做到。
我正在写一个Django应用程序来管理芹菜任务。我将django-celery-beat
用于计划任务,但我希望有一个类似的管理界面来启动带有接受参数的表单的临时任务。我希望它与IP管理部分,因为这是所有的应用程序;目前没有其他视图
ModelAdmin
的所有文档都是基于模型的自定义字段,但我不认为这个对象需要存储在模型中,因为它们是瞬态的,数据将由芹菜任务保存。从我从文档的理解,你不能注册一个自定义管理视图没有尝试它的模型。
我正在寻找的是一个不绑定到模型的自定义视图,这样我就可以在管理部分为这些管理命令创建一个自定义表单。
我的想法:
- 在
Meta
中使用 - 创建一个真正的模型,但永远不要在自定义
ModelForm
中访问它 - 只需手动创建一个视图并将URL添加到admin部分。这可能是最简单的方法,但我一直在避免,因为我不确定什么需要将其绑定到管理员的认证系统或显示管理页面内的链接,当其他一切都是自动生成的。
managed = False
创建虚拟模型感谢任何提示。我会测试所有合理的答案,并选择最好的作为正确的答案,但会为所有的回答投票。
编辑:@dejavu_cmd_delt提出了Flower的伟大建议,但如果可能的话,我想把它全部集成到admin
部分中。
我放弃了:)这似乎是一个太多的反模式,所以我放弃了这个想法,并基于django_celery_beat
中的一个创建了一个简单的自定义模型,用于特殊任务。这使我能够利用ScheduledTask
模型表单的任务检测方法,并使用pre_save
钩子在创建时向芹菜发出任务。然后,我创建了一个单独的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)