Присвоить категорию с помощью действия в админке django

могу ли я использовать django actions для присвоения категории моим статьям в django-admin?

class Category(models.Model):
    name = models.CharField(max_length=155, db_index=True)

class Woman(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField(blank=True)
    photo = models.ImageField(upload_to='img', blank=True)
    time_create = models.DateTimeField(auto_now_add=True)
    time_update = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=True)
    cat = models.ForeignKey(Category, on_delete=models.PROTECT,null=True)

Как мне создать действие, с помощью которого можно будет присваивать категории нескольким статьям. Я имею в виду что-то вроде этого, но мне нужно 'Mark as "name of category" ' вместо 'Delete selected users'. Надеюсь, вы меня поймете, я не знаю, как объяснить это лучше

enter image description here

(Это не мой скриншот, просто взял его из документации для большего понимания)

Да, я предполагаю, что это возможно... но это не будет динамично, как я предполагаю, вы хотите

Это был бы способ

admin.py

from django.contrib import admin
from myapp.models import Category, Women

@admin.action(description='Mark selected as Category 1') # <- text of the dropdown
def set_cat_1(modeladmin, request, queryset):
    # action to do:
    queryset.update(cat=Category.objects.get(pk=1))

@admin.action(description='Mark selected as Category 2')
def set_cat_2(modeladmin, request, queryset):
    queryset.update(cat=Category.objects.get(pk=2))

class WomenAdmin(admin.ModelAdmin):
    list_display = ['title', 'cat']
    ordering = ['title']
    actions = [set_cat_1, set_cat_2,]

admin.site.register(Women, WomenAdmin)

При добавлении новой Категории вам придется добавить новое действие + добавить его в список действий администратора.


Возможно, есть способ сделать его динамическим, но не сразу понятно, является ли это разумным вариантом

Редактирование:

Возможно, это динамическая опция, но точно не из документации; это довольно дико имо.
Я только что вырвал + изменил это из этого: Django Admin app: создание динамического списка действий администратора
. Мне было бы интересно услышать, работает ли это

admin.py
from django.contrib import admin
from myapp.models import Category, Women

class WomenAdmin(admin.ModelAdmin):
    list_display = ['title', 'cat']
    ordering = ['title']

    def make_action(category):
        name = 'mark_%s' % category
        action = lambda modeladmin, req, qset: qset.update(cat=category)
        return (name, (action, name, "Mark selected as %s" % category))

    def get_actions(self, request):
        return dict([make_action for c in Category.objects.all()])

admin.site.register(Women, WomenAdmin)

Возможно, это удалит ваши действия по умолчанию... Так что если вы все еще хотите их получить, попробуйте что-нибудь вроде:

def get_actions(self, request):
    actions = super().get_actions(request)
    actions.update(dict([make_action for c in Category.objects.all()]))
    return actions
Вернуться на верх