Присвоить категорию с помощью действия в админке 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'. Надеюсь, вы меня поймете, я не знаю, как объяснить это лучше
(Это не мой скриншот, просто взял его из документации для большего понимания)
Да, я предполагаю, что это возможно... но это не будет динамично, как я предполагаю, вы хотите
Это был бы способ
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