У меня есть огромный проект Django, к которому я делаю настройки. Мне нужно иметь одно выпадающее поле, которое автоматически заполняет два других поля только для чтения на странице администратора. Я хочу сделать это без сохранения или обновления страницы. Я хочу, чтобы поля, доступные только для чтения, мгновенно менялись при изменении выпадающего списка.
Прямо сейчас у меня есть раскрывающийся список и два поля только для чтения, но не сразу. Только для чтения поля обновляются, чтобы соответствовать раскрывающемуся списку при сохранении, а затем снова открывают этот экземпляр. Я сделал это, переписав метод сохранения:
def save(self, *args, **kwargs):
self.firstname = self.fullname.split()[0]
self.lastname = self.fullname.split()[1]
super().save(*args, **kwargs)
Я знаю, что есть стратегия javascript onchange, которая может сделать это, я просто немного запутался, как применить это к фреймворку Django, чтобы заставить его вести себя как задумано. Любая помощь будет очень ценится.
UPDATE:
Я думаю, что я понял это. В файле change_form.html, который находится в contrib / admin / templates / admin, можно добавить javascript в блок after_field_sets, чтобы сначала были добавлены поля, а затем вы можете манипулировать ими, используя их идентификаторы, которые можно найти, открыв вид разработчика на вашей странице.
Я все еще должен проверить и отладить, но этот код, кажется, работает:
<script type="text/javascript">
document.getElementById("id_firstname").readOnly = true;
document.getElementById("id_lastname").readOnly = true;
(function($){
$("select").change(function(){
document.getElementById("id_firstname").value = document.getElementById("id_fullname").value.split(" ")[0]
document.getElementById("id_lastname").value = document.getElementById("id_fullname").value.split(" ")[1]
}).change();
})(django.jQuery);
</script>
Примечание: вам нужно поместить копию вашего отредактированного файла change_form.html в templates / admin / your-app / your-model, и инфраструктура Django будет использовать эту версию файла change_form.html в качестве переопределения для оригинала для конкретного модель, указанную в структуре вашей папки.