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 и при таком подходе и эта проблема будет решена

Вернуться на верх