Ваш первый порт вызова должен быть документацией , который объясняет это разумно ясно:
Брошено, чтобы указать, что к массиву был обращен незаконный индекс. Индекс является либо отрицательным, либо большим или равным размеру массива.
Так, например:
int[] array = new int[5]; int boom = array[10]; // Throws the exception
Как избежать этого. ., не делайте этого. Будьте осторожны с вашими индексами массива.
Одной из проблем, с которыми иногда сталкиваются люди, является то, что массивы 1-индексируются, например
int[] array = new int[5]; // ... populate the array here ... for (int index = 1; index <= array.length; index++) { System.out.println(array[index]); }
Это пропустит первый элемент (индекс 0 ) и выдают исключение, когда индекс равен 5. Действующие индексы здесь 0-4 включительно. Правильный, идиоматический оператор
for
здесь будет:for (int index = 0; index < array.length; index++)
(Предполагается, что вы нуждаетесь в индексе, конечно. Если вы можете использовать расширенный для цикла, сделайте это.)
Вы устанавливаете fields
на CreateView
, поэтому вы позволяете Django автоматически сгенерировать ModelForm
для вас. Форма использует ModelMultipleChoiceField
, который происходит от ModelChoiceField
, описанного здесь .
Если вы прочитаете последний абзац этого раздела, вы увидите, что отображаемые значения для такого поля получены из метода модели __str__
, или вы можете переопределить это с помощью метода label_from_instance()
.
Вот что вам нужно сделать, переопределить этот метод в ModelMultipleChoiceField
. Но для этого вам нужно указать свою собственную форму.
Итак:
Hotel
(HotelForm
). ModelMultipleChoiceField
(ColleagueChoiceField
) и переопределите метод label_from_instance()
, чтобы отобразить pk
. colleagues
в HotelForm
как ColleagueChoiceField
. fields
на вашем виде и установите вместо form_class
значение HotelForm
.