如何从 Django 管理员触发 Celery 任务?

5 django django-admin celery

我有一个模型叫Publication,我想在 Django Admin 中的列表视图中添加一个按钮,该按钮将允许触发 Celery 任务。

\n\n

admin.py:

\n\n
from django.contrib import admin\nfrom .models import Publication\n\n\nclass PublicationAdmin(admin.ModelAdmin):\n    change_list_template = "variants/admin_publication_list.html"\n\n    def update(self, request):\n        # trigger task\n        # redirect to admin list\n\nadmin.site.register(Publication, PublicationAdmin)\n
Run Code Online (Sandbox Code Playgroud)\n\n

variants/admin_publication_list.html:

\n\n
{% extends \'admin/change_list.html\' %}\n\n{% block object-tools %}\n  <li>\n    <a href="/admin/variants/publication/update/">\n      Update\n    </a>\n  </li>\n  {{ block.super }}\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我按下按钮时,我只会收到通知:

\n\n
\n

ID 为 \xe2\x80\x9cupdate\xe2\x80\x9d 的发布不存在\xe2\x80\x99。也许它被删除了?

\n
\n

Suk*_*ann 2

方法名称update或路由名称update太通用,有时会被框架自动使用,请尝试命名它以匹配您的功能。revoke-publications或者sync-publications

admin.py:

from django.contrib import admin
from django.urls import path
from django.http import HttpResponseRedirect
from .models import Publication
from .tasks import your_celery_task

@admin.register(Publication)
class PublicationAdmin(admin.ModelAdmin):
    change_list_template = "variants/admin_publication_list.html"

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('update-publications/', self.publication_update),
        ]
        return my_urls + urls

    def publication_update(self, request):
          result = your_celery_task.delay("some_arg")
          self.message_user(
              request,
              f"Task with the ID: {result.task_id} was added to queue. Last known status: {result.status}"
          )
          return HttpResponseRedirect("../")

Run Code Online (Sandbox Code Playgroud)

variants/admin_publication_list.html:

{% extends 'admin/change_list.html' %}

{% block object-tools %}
    <div>
        <form action="update-publications/" method="POST">
            {% csrf_token %}
                <button type="submit">Run Celery Task</button>
        </form>
    </div>
    <br />
    {{ block.super }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)