Как мы можем переопределить кверисет Dango ModelAdmin над кверисетом ModelForm?

Требуется отобразить экземпляры M2M в выпадающем списке для разных логинов. Каждый логин сможет видеть только экземпляры, принадлежащие его собственному домену. Поскольку этот выпадающий список является динамическим списком значений строк таблицы, я хочу использовать

widget  = forms.CheckboxSelectMultiple   which is part of the ModelForm where we need to pass the queryset. This queryset overrides the M2M form field definition:

 def formfield_for_manytomany(self, db_field, request, **kwargs): 
< <
class GroupA(models.Model):
    address = models.EmailField(
        unique=True,verbose_name='Email id of the group')
    mailboxes = models.ManyToManyField(Mailbox,
                                       related_name='my_mailboxes')

class GroupForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['mailboxes'].widget.attrs={"style":"height:100px;"}
        
    class Meta:
        model = GroupA
        fields = "__all__"
    mailboxes = forms.ModelMultipleChoiceField(
         queryset = Mailbox.objects.all(),
         widget  = forms.CheckboxSelectMultiple
     )
models.py: <
class GroupAdmin(admin.ModelAdmin):
    form = GroupForm
 
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "mailboxes":
            #if request.user.groups.filter(name__in=['customers']).exists():
            kwargs["queryset"] = Mailbox.objects.filter(
                domain__customer__email=request.user.email)
            #print(kwargs["queryset"], 'qqqqqq')
            for k in kwargs["queryset"]:
                print(k, 'kkkkkkkkkk')
        return super(GroupAdmin, self).formfield_for_manytomany(
            db_field, request, **kwargs)
В файле admin.py

Фильтрация работает, когда мы не используем виджет MultiCheckbox. Хочется иметь фильтрованные чекбоксы. Используем django3.2. python3.8. Пожалуйста, подскажите

Глядя на код администрирования модели django, не уверен почему, но кажется, что ModelAdmin не уважает поле "многие ко многим", настроенное в пользовательской форме.

Но если вам нужны отфильтрованные флажки, вы можете сделать что-то вроде этого в formfield_for_manytomany:

from django import forms

class GroupAdmin(admin.ModelAdmin):
    # ...
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "mailboxes":
            kwargs["queryset"] = Mailbox.objects.filter(
                domain__customer__email=request.user.email
            )
            kwargs["widget"] = forms.CheckboxSelectMultiple

        return super().formfield_for_manytomany(db_field, request, **kwargs)
Вернуться на верх