Django - Admin - Defualt Add/Change Form
Мне интересно, какой лучший метод и как добавить информационное поле во встроенные формы добавления/изменения администратора.
Вот мой случай:
У меня есть 3 модели, каждая из которых связана с другой внешним ключом инвестор --> инвестиции распределение --> инвестиции
Таким образом, с помощью соответствующего запроса я могу легко найти в таблице распределения, какой инвестор получил какое распределение
Если я хочу добавить распределение с помощью встроенных форм администрирования Django - опция выбора поля "инвестиции" для формы добавления распределения в выпадающем списке будет включать все инвестиции. Проблема в том, что если у меня есть одинаковое имя инвестиции для двух инвесторов, я не знаю, какой вариант выбрать. Поэтому я бы хотел, чтобы форма искала инвестора с помощью Investment --> Investor во время добавления/изменения распределения, таким образом, когда я добавляю распределение к инвестициям, я могу выбрать, к какому инвестору оно относится.
и.д. Инвестор Пол имеет инвестиции AAPL, GME, BB Инвестор Алан имеет инвестиции TSLA, GME. Добавление распределения для инвестиций GME ---> эта форма должна содержать 2 опции GME, но я хотел бы знать, какая из них принадлежит Полу, а какая Алану
На главной странице администратора для дистрибутивов я вижу это, используя list_display и вставляя функцию для вызова поиска (код вставлен ниже), но мне нужна та же информация на форме добавления/изменения
models.py
class Distribution(models.Model):
distribution_id = models.AutoField(primary_key=True)
investment = models.ForeignKey('Investment', models.DO_NOTHING, blank=True, null=True)
distribution_amount = models.DecimalField(max_digits=18, decimal_places=4, blank=True, null=True)
distribution_date = models.DateField(blank=True, null=True)
class Meta:
db_table = 'distribution'
def __str__(self):
return f'{self.investment} for {self.distribution_amount}'
class Investment(models.Model):
investment_id = models.AutoField(primary_key=True)
investment_name = models.CharField(max_length=255, blank=True, null=True)
initial_investment = models.DecimalField(max_digits=19, decimal_places=4, blank=True, null=True)
date_of_investment = models.DateField(blank=True, null=True)
investor = models.ForeignKey('Investor', models.DO_NOTHING, blank=True, null=True)
class Meta:
ordering = ('investment_name',)
def __str__(self):
return self.investment_name
class Investor(models.Model):
investor_id = models.AutoField(primary_key=True)
first_name = models.CharField(max_length=255, blank=True, null=True)
last_name = models.CharField(max_length=255, blank=True, null=True)
class Meta:
ordering = ('last_name',)
def __str__(self):
return f'{self.last_name}, {self.first_name}'
admin.py
from django.contrib import admin
# Register your models here.
from .models import Distribution, Investment, Investor
@admin.register(Distribution)
class DistributionAdmin(admin.ModelAdmin):
list_display = ('investment', 'get_investor' ,'distribution_amount')
@admin.display(description='Investor Name')
def get_investor(self, obj):
return obj.investment.investor
@admin.register(Investment)
class InvestmentAdmin(admin.ModelAdmin):
list_display = ('investment_name', 'investor')
@admin.register(Investor)
class InvestorAdmin(admin.ModelAdmin):
list_display = ('full_name_display',)
@admin.display(description='Investor Name')
def full_name_display(self, obj):
return f'{obj.last_name}, {obj.first_name}'