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

Django: Search many to many field while creating object

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

有没有办法添加搜索字段或类似于 django admin 的东西以便更容易 selection?

你的选择不多。

1。 filter_horizontal

有了filter_horizontal,你可以在admin中使用水平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',)
    ...

我想你想过滤成分并 select 在管理员 UI

上一一过滤

You can use django forms builtin CheckboxSelectMultiple widget in place of SelectMultiple to make selection easy

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)

Alternatively, you can use django-better-filter-widget package if you want a search input on choices, Refer Github repo for installation

这是一个自定义小部件,通过覆盖 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)