Сделать ModelMultipleChoiceField с виджетом FilteredSelectMultiple - только для чтения (Python Django)
В моем проекте я использую промежуточную модель CustomizedUserGroups для поддержания отношений между моделями CustomizedUser и Group:
# models.py
class CustomizedUser(AbstractUser):
first_name = models.CharField(max_length=255, verbose_name='имя')
last_name = models.CharField(max_length=255, verbose_name='фамилия')
# other fields
groups = models.ManyToManyField(Group, verbose_name='группы', related_name='users', through='CustomizedUserGroups')
<<<Поэтому в классе администратора () для CustomizedUserAdmin я не могу позволить CustomizedUser содержать fieldsets (иначе произойдет 'groups'). Поэтому я определил The value of 'fieldsets[2][1]["fields"]' cannot include the ManyToManyField 'groups', because that field manually specifies a relationship model. вручную (без fieldsets) и проблема была решена.groups
# admin.py
class CustomizedUserAdmin(UserAdmin):
fieldsets = ((None, {'fields': ('username',)}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'patronymic', 'role', 'email')}))
Предполагается, что значение для поля groups в модели CustomizedUser присваивается автоматически в зависимости от других значений из полей формы регистрации, поэтому когда пользователь добавляет нового пользователя через панель администратора, нет необходимости отображать поле groups. Но когда пользователь хочет отредактировать данные другого пользователя через панель администратора, я хочу, чтобы поле group было показано ему в режиме только для чтения.
Для решения этой проблемы я создал ExtendedUserChangeForm, где определил поле group_list:
# forms.py
class ExtendedUserChangeForm(UserChangeForm):
group_list = forms.ModelMultipleChoiceField(label='Группы пользователя', queryset=Group.objects.all(),
required=False,
widget=FilteredSelectMultiple('группы пользователя', False, attrs={
'disabled': True
}))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
username = self.initial['username']
user = CustomizedUser.objects.get(username=username)
if user.groups:
self.fields["group_list"].initial = user.groups.all()
Я также назначил эту форму как add_form в CustomizedUserAdmin и заставил fieldsets динамически включать group_list, когда используется add_form. Это решило большую часть проблемы. Когда я пытаюсь редактировать другого пользователя через админ панель, я действительно вижу поле groups_list, которое отображает фактическое содержимое поля groups для этого пользователя, но режим read only (который я активировал через disabled=True в атрибутах виджета) работает только для левой половины виджета, и я все еще могу нажимать на его кнопки, в то время как я хотел бы, чтобы все части виджета были некликабельны. Пожалуйста, посмотрите на скриншот, чтобы понять, что я имею в виду. Как я могу сделать это, продолжая использовать виджет FilteredSelectMultiple?