![](/img/trans.png)
[英]How to display all available choices of a manytomany field in django admin using filter_horizontal
[英]Modifying Available and Chosen Choices For ManyToMany Field With Horizontal Filter In Django Model Admin
在 Model Admin 中,是否可以在可用字段和選定字段中控制ManyToManyField
horizontal_filter
ntal_filter 小部件中顯示的內容?
例如,我有一個County
model 和一個Territory
County
,如果它已經分配給Territory
,我想隱藏它。
下面的問題是選定的County
對象將隱藏在帶有horizontal_filter
ntal_filter 的“可用”和“選擇”小部件中。 是否可以只將它們隱藏在“可用”列中?
class TerritoryAdmin(admin.ModelAdmin):
filter_horizontal = ('counties',)
ordering = ('territory_name', )
# remove counties already assigned to a territory
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == 'counties':
assigned = Territory.objects.all(
).values_list('counties__fips_code', flat=True)
kwargs["queryset"] = County.objects.exclude(fips_code__in=assigned)
return super().formfield_for_manytomany(db_field, request, **kwargs)
您需要在自定義ModelForm
中執行此邏輯,因為您需要instance
包含在編輯時已選擇的縣
class TerritoryAdminForm(forms.ModelForm):
def __init__(self, *args, instance=None, **kwargs):
super().__init__(*args, instance=instance, **kwargs)
counties_filter = Q(territories__isnull=True)
if instance:
counties_filter |= Q(territories__id=instance.id)
self.fields['counties'].queryset = County.objects.filter(countries_filter)
@admin.register(Foo)
class TerritoryAdmin(admin.ModelAdmin):
form = TerritoryAdminForm
filter_horizontal = ['counties']
在不知道縣和地區之間關系的名稱的情況下,我假設它被命名為“地區”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.