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

时间:2018-07-11 06:54:00

标签: django python-3.x django-models django-admin django-2.0

我有一个用例,其中有多个Ingredient可以通过Django管理员链接到Recipe。现在我大约有一百种配料,这使得在以下用户界面中选择配料非常困难。

enter image description here

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

2 个答案:

答案 0 :(得分:3)

您别无选择。

1。 filter_horizontal

通过filter_horizo​​ntal,您可以在admin中使用水平m2m ui。我更喜欢在admin中使用m2m。

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

结果将是...

enter image description here

2。 raw_id_fields docs

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

当您有很多m2m字段时,这很有用。另外,很容易过滤要添加的m2m obj。

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

答案 1 :(得分:1)

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

  

您可以使用内置CheckboxSelectMultiple的django表单   小部件代替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仓库   安装

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