[Django]-How do I trigger a Celery task from Django admin?

2👍

Method name update or route name update is too generic and sometimes used by frameworks automatically, try naming it to match your functionality. revoke-publications or 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("../")

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 %}

Leave a comment