Django select2 с автозаполнением_полей, чтобы иметь динамическое значение по умолчанию
У меня есть модель Product
и модель HeadFlowDataset
. Эти две модели связаны отношением прайнкей, в котором одна product
может иметь много headflowdataset
пар.
Коды моделей приведены ниже:
class Product(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False,
)
...
# other fields in the model, not exactly related to this problem
class HeadFlowDataSet(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False,
)
product = models.ForeignKey(
Product,
on_delete=models.CASCADE,
)
head = models.FloatField()
flow = models.FloatField()
def __str__(self):
return self.product.pump_name
Каждый продукт может иметь до 10-15 наборов головных потоков. И в настоящее время я использую админ-панель Django для заполнения базы данных продуктов. С другой стороны, всего может быть до 1000 продуктов. Поэтому, когда администратор пытается добавить наборы данных головного потока, процесс был немного сложным, чтобы найти название продукта из меню выбора, которое предоставляет Django admin. Поэтому я использовал Django autocomplete_fields
в ModelAdmin, как показано ниже, чтобы администратор мог, по крайней мере, искать название продукта:
class HeadFlowDatasetAdmin(admin.ModelAdmin):
list_display = (
"product",
"head",
"flow",
)
fields = (
"product",
"head",
"flow",
)
autocomplete_fields = ["product"]
def get_ordering(self, request):
return [Lower("product__pump_name"), "head"]
Но этот подход тоже немного раздражает поиском названия продукта каждый раз, когда мы пытаемся добавить новый набор данных о расходе воды.
ВОПРОС:
Как я могу установить значение по умолчанию для этого поля select2
, которое динамически устанавливает последний искомый продукт в качестве значения по умолчанию? Чтобы когда администратор пытался добавить новый набор данных головного потока, он видел последний продукт, выбранный по умолчанию, пока он вручную не изменит продукт?
Вы можете использовать концепцию в Django под названием InlineModelAdmin
[django-docs] и в вашем случае, ваш admin.py
модуль может быть похож на следующий:
from django.contrib import admin
from your_app_name.models import Product, HeadFlowDataSet
class HeadFlowDatasetInline(admin.TabularInline):
model = HeadFlowDataSet
extra = 10
max_num = 1000
@admin.register(HeadFlowDataset)
class HeadFlowDatasetAdmin(admin.ModelAdmin):
list_display = (
"product",
"head",
"flow",
)
fields = (
"product",
"head",
"flow",
)
def get_ordering(self, request):
return [Lower("product__pump_name"), "head"]
class Meta:
model = HeadFlowDataSet
@admin.register(Product)
class ProductModelAdmin(admin.ModelAdmin):
list_display = (...)
fields = (...)
inlines = [HeadFlowDatasetInline,]
class Meta:
model = Product
С помощью приведенного выше фрагмента кода у вас есть инлайн-часть со списком из 10
количества HeadFlowDataset
объектов до 1000
на каждой странице ваших Product
моделей в вашей админ-панели Django и при таком подходе и эта проблема будет решена