Поле символов с вводом select2 не заполняется в представлении обновления

Я работаю над формой, которая получает от пользователя информацию об "Образовании". Название института является одним из полей в модели.

Начальная конфигурация для модели:

class Education(models.Model):
   owner = models.ForeignKey(Profile, on_delete=models.CASCADE, null=False, blank=False)
   institute = models.CharField(max_length=50, null=True, blank=True)
   program = models.CharField(max_length=50, null=True, blank=True)
   level = models.CharField(max_length=1, choices=StudyLevel.choices, default=StudyLevel.UNSPECIFIED)
   id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

Я не хочу предоставлять пользователям возможность вводить бессмысленные данные. Поэтому я решил позволить пользователям "выбирать" свой университет из внешнего API. Пример поиска: http://universities.hipolabs.com/search?name=johannes

Я использовал jQuery Select2 с Ajax для получения данных из API каждый раз, когда пользователь вводит символ в поле.

Аякс-код:

$(document).ready(function () {
$('#id_institute').select2({
    ajax: {
        url: 'http://universities.hipolabs.com/search?',
        data: function (params) {
            return {
                name: params.term
            };
        },
        dataType: 'json',
        processResults: function (data) {
            return {
                results: $.map(data, function (item) {
                    return {id: item.name, text: item.name};
                })
            };
        }
    },
    width: '50%',
    minimumInputLength: 1
});

И мне пришлось переписать виджет для поля 'institute' в ModelForm следующим образом:

class EducationForm(ModelForm):
   class Meta:
       model = Education
       fields = '__all__'
       exclude = ['owner']
       widgets = {
           'institute': forms.Select(),
       }

Все работает так, как ожидалось: create view

Однако, когда я перехожу к представлению обновления модели, первоначальный выбор не выбирается автоматически. (другие поля формы заполнены правильно) представление обновления

Я пытался изменить функцию ModelForm init, но не смог добиться успеха.

Я использовал библиотеку select2 для поля модели с типом models.ForeignKey (без ajax, с опциями из базы данных) и у него нет проблем с загрузкой начального выбора в представление обновления

В связи с этим у меня возник вопрос, является ли models.Charfield хорошим способом хранения такого рода данных в модели. Каков наилучший способ хранения выбора пользователя? Если это лучший способ, то что я делаю неправильно?

Кроме того, я понимаю, что существует специализированная библиотека django-select2, но я ее не использовал. Имеет ли это какое-то значение, кроме того, что мне не придется самому писать код ajax и т.д.?

Создание и обновление представлений модели:

class EducationCreateView(LoginRequiredMixin, CreateView):
   model = Education
   form_class = EducationForm
   success_url = '/account'

   def form_valid(self, form):
       form.instance.owner = self.request.user.profile
       return super().form_valid(form)

class EducationUpdateView(LoginRequiredMixin, UpdateView):
   model = Education
   form_class = EducationForm
   success_url = '/account'

HTML-форма, которую я использую для ModelForm:

<form class="form" method="post" action="">
   {% csrf_token %}
   {% for field in form %}
      <div class="form__field">
        <label for="formInput#text">{{ field.label }} </label>
        {{ field }}
      </div>
   {% endfor %}
   <input class="btn btn--sub btn--lg  my-md" type="submit" value="Submit"/>
</form>

Спасибо.

Я обнаружил, что в документации Select2 есть раздел, посвященный именно этому случаю:

https://select2.org/programmatic-control/add-select-clear-items#preselecting-options-in-an-remotely-sourced-ajax-select2

Теперь представление обновления также работает как ожидалось. Но я хотел бы узнать ваше мнение о том, какой тип поля следует использовать.

Вернуться на верх