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_horizontal,您可以在管理中使用水平 m2m ui。我更喜欢在管理员中使用 m2m 的这种方式。
class YourAdmin(admin.ModelAdmin):
filter_horizontal = ('m2m_field',)
...
结果将是……
2。 raw_id_fields
docs
您可以使用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:对象需要具有字段“...”的值才能使用这种多对多关系