@NyxDeveloper

Как передать параметр initial в поле select multiple формы django?

Уже долгое время мучаюсь с вопросом, нагуглить не удалось. Я делаю добавление пользователя в группы при создании, решил использовать мультиселект. Все работает как я и хотел, но при редактировании пользователя хотел вывести в форму значения уже присвоенных ему групп в поле select, но при передаче в form.base_fields['groups'].initial значения QuerySet из групп пользователя, они добавляются в параметры инициализации, но не отображаются на странице.
Выглядит форма и представление следующим образом:
class EditSotrForm(forms.ModelForm):
    class Meta:
        model = Sotr
        fields = [
            'firstName',
            'lastName',
            'middleName',
            'idDolj',
            'description'
        ]

        widgets = {
            'idDolj': forms.Select(attrs={
                'class': 'form-control'
            }),
        }

    groups = forms.ModelChoiceField(queryset=Group.objects.all(), widget=forms.SelectMultiple(attrs={
        'class': 'select2bs4 select2-hidden-accessible form-control',
        'multiple': '',
        'tabindex': '-1',
        'aria-hidden': 'true'
    }))

    login = forms.CharField()
    password = forms.CharField()
    confirmPassword = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(EditSotrForm, self).__init__(*args, **kwargs)
        self.fields['firstName'].widget = forms.TextInput(attrs={'class': 'form-control'})
        self.fields['lastName'].widget = forms.TextInput(attrs={'class': 'form-control'})
        self.fields['middleName'].widget = forms.TextInput(attrs={'class': 'form-control'})
        self.fields['login'].widget = forms.TextInput(attrs={'class': 'form-control'})
        self.fields['password'].widget = forms.PasswordInput(attrs={'class': 'form-control'})
        self.fields['confirmPassword'].widget = forms.PasswordInput(attrs={'class': 'form-control'})
        # self.fields['idDolj'].widget = forms.Select(attrs={'class': 'form-control'})
        self.fields['description'].widget = forms.Textarea(attrs={'class': 'form-control'})

        self.fields['idDolj'].required = False
        self.fields['groups'].required = False
        self.fields['description'].required = False
        self.fields['firstName'].required = False
        self.fields['lastName'].required = False
        self.fields['middleName'].required = False
        self.fields['login'].required = False
        self.fields['password'].required = False
        self.fields['confirmPassword'].required = False


@login_required
def EditSotrView(request, objId):
    if request.method == 'GET':
        form = EditSotrForm(instance=Sotr.objects.get(id=objId))
        form.base_fields['groups'].initial = Sotr.objects.get(id=objId).user.groups.constrained_target
        return render(request, 'edit_sotr.html', {
            'form': form,
            'objId': objId
        })


Возможно я делаю что-то не правильно, подскажите, кто уже сталкивался с такой проблемой?
  • Вопрос задан
  • 28 просмотров
Решения вопроса 1
@NyxDeveloper Автор вопроса
initial поля по умолчанию типа list, так что ему можно передать список, состоящий из нужных id объектов интересующей вас модели (главное чтобы эта модель соответствовала типу объектов в queryset поля)
form.base_fields['field_name'].initial = [
    i for i in form.base_fields['field_name'].choices.queryset.filter(id__in=[1, 2, 3, 4])
]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@siarheisiarhei
это принципиально не возможно ни средствами dj ни js....
я выкрутился вставкой формы(html) и вставкой initial={{ tag }}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы