簡體   English   中英

在 Django Model 中使用水平過濾器修改多對多字段的可用和選擇選項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM