Добавить динамически генерируемые столбцы в представление списка администратора django - PullRequest
0 голосов
/ 30 января 2019

Backgorund

У меня есть две модели:

TYPE_CHOICES = (
    (0, 'Income'),
    (1, 'Outcome'),
)

class Transaction(models.Model):
    type = models.IntegerField(choices=TYPE_CHOICES)
    amount = models.IntegerField()
    store = ForeignKey(Store)

class Store(models.Model):
    name = models.CharField(max_length=300)
    email = models.EmailField(max_length=300)
    balance = models.ForeignKey(Transaction)

Что мне нужно для достижения

В настоящее времяdjango показывает этот вывод в виде списка администратора для движений модели (при условии, что у нас есть два хранилища):

Type     Amount  Store
------------------------
Income   100     Store A
Outcome  20      Store A
Income   500     Store B

Я хотел бы показать пользовательские столбцы, каждый из которых показывает частичный баланс для магазина:

Type     Amount  Store    Store A Balance  Store B Balance
----------------------------------------------------------
Income   100     Store A  100              0
Outcome  20      Store A  80               0
Income   500     Store B  80               500

Я знаю, как создать настраиваемый статический столбец, и я знаю, как рассчитать значения для строк, но я не могу понять, как сделать столбцы динамическими, т.е. отображать в соответствии с другой моделью.

PS : Обратите внимание, что количество / названия магазинов могут измениться.Если я добавлю новое хранилище, частичное сальдо для этого хранилища также должно отображаться в виде списка.

1 Ответ

0 голосов
/ 30 января 2019

При добавлении модели к администратору вы можете отобразить методы из вашего класса администратора в виде столбцов списка:

class AdminTransaction(admin.ModelAdmin):
    list_display = ('type', 'amount', 'store', 'dynamic')

    def dynamic(self, obj):
       # obj here is the object in this row of the list.
       # Lets say you want to show the difference between the amount of
       # the current transaction and the maximum amount is known then:
       maximum_known = AdminTransaction.objects.aggregate(max_amount=MAX('amount'))
       return maximum_known['max_amount'] - obj.amount

Ссылка: https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

...