Django用autocomplete_fields选择一个动态的默认值



我有一个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种产品。因此,当管理员试图添加head-flow数据集时,要从Django admin提供的选择菜单中找到产品名称就有点困难了。因此,我在ModelAdmin中使用Djangoautocomplete_fields,如下所示,以便管理员至少可以搜索产品名称:

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 = 1

class ProductAdmin(admin.ModelAdmin):
list_display = (
"pump_name",
"main_model",
"usage",
"pump_type",
)
search_fields = (
"pump_name",
"main_model__model_name_fa",
"usage__usage_name_fa",
"pump_type__type_name",
)
fields = (
"main_model",
"usage",
"sub_usage",
"pump_type",
"pump_name",
"pump_image",
"NPSH_diagram_image",
"power_diagram_image",
"max_head",
"max_flow",
"motor_ph",
"motor_rpm",
"pump_technical_datasheet_fa",
"pump_technical_datasheet_en",
)
inlines = [HeadFlowDatasetInline]
def save_model(self, request, obj, form, change):
obj.created_by = request.user
obj.last_updated_by = request.user
obj.save()
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user
instance.save()

在上面的代码片段中,你有一个内联部分,在你的Django管理面板的Product模型的每一页上都有一组HeadFlowDataset对象,可以在需要时添加到该面板中,使用这种方法,这个问题将得到解决。

最新更新