Как мы можем переопределить кверисет 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)