Django:在创建对象时搜索多对多字段

Posted

技术标签:

【中文标题】Django:在创建对象时搜索多对多字段【英文标题】:Django: Search many to many field while creating object 【发布时间】:2018-12-19 02:43:30 【问题描述】:

我有一个用例,我有多个 Ingredient,可以通过 Django 管理员链接到 Recipe。现在我有大约一百种成分,这使得在以下 UI 中选择成分变得非常困难。

有没有办法添加搜索字段或类似于 django 管理员的内容以便于选择?

【问题讨论】:

【参考方案1】:

你的选择很少。

1。 filter_horizontal

使用 filter_horizo​​ntal,您可以在管理中使用水平 m2m ui。我更喜欢在管理员中使用 m2m 的这种方式。

class YourAdmin(admin.ModelAdmin):
    filter_horizontal = ('m2m_field',)
    ...

结果将是……

2。 raw_id_fieldsdocs

您可以使用raw_id_fields 在您的 m2m 字段中使用弹出模式。

当你有很多 m2m 字段时,它有点有用。此外,过滤要添加的 m2m obj 也很容易。

class YourAdmin(admin.ModelAdmin):
    raw_id_fiedls = ('m2m_field',)
    ...

【讨论】:

【参考方案2】:

我想你想过滤成分并在管理界面上一一选择

您可以使用内置的 django 表单 CheckboxSelectMultiple 小部件代替 SelectMultiple 以方便选择

from django import forms
from django.contrib import admin

class RecipeForm(forms.ModelForm):

    class Meta(object):
        model = Recipe
        widgets = 
            'Ingredient': forms.CheckboxSelectMultiple,
        


class RecipeAdmin(admin.ModelAdmin):

    form = RecipeForm

admin.site.register(Recipe, RecipeAdmin)

或者,您可以使用django-better-filter-widget 如果你想要一个关于选项的搜索输入,请参考 Github repo for 安装

它是一个自定义小部件,通过覆盖 SelectMultiple 小部件创建 Django 表单

from django import forms
from django.contrib import admin
from better_filter_widget import BetterFilterWidget

class RecipeForm(forms.ModelForm):

    class Meta(object):
        model = Recipe
        widgets = 
            'Ingredient': BetterFilterWidget(),
        


class RecipeAdmin(admin.ModelAdmin):
    form = RecipeForm

admin.site.register(Recipe, RecipeAdmin)

【讨论】:

BetterFilterWidget 可以在管理员之外以“正常”形式使用吗?

以上是关于Django:在创建对象时搜索多对多字段的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中插入多对多对象的正确方法?

Django:对象需要具有字段“...”的值才能使用这种多对多关系

Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项

Django如何过滤多对多字段中的对象,而不是原始查询集

Django基于多对多字段的第一个对象进行排序

在 Django Admin 中过滤多对多框