Поле символов с вводом 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 есть раздел, посвященный именно этому случаю:
Теперь представление обновления также работает как ожидалось. Но я хотел бы узнать ваше мнение о том, какой тип поля следует использовать.