Как сделать выпадающий список автоматически заполнять другие поля в Django - PullRequest
2 голосов
/ 01 июля 2019

У меня есть огромный проект 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 в качестве переопределения для оригинала для конкретного модель, указанную в структуре вашей папки.

...