Django ModelChoiceField изначально не выбран в соответствии с родственными моделями - PullRequest
0 голосов
/ 03 сентября 2018

У меня возникли некоторые трудности с ModelChoiceField в Django.

Я написал следующий код:

class BookForm(ModelForm):
    publisher = forms.ModelChoiceField(queryset=Publisher.objects.all())
    ...

Теперь книга и издатель связаны следующим образом: Книга -> Библиотека -> SubPublisher -> Издатель. Все отношения были сделаны с использованием ForeignKey.

Моя форма такая:

  • Publisher (ModelChoiceField)
  • SubPublisher (ModelChoiceField с виджетом автозаполнения, который фильтрует в соответствии с выбором издателя)
  • Библиотека (аналогично SubPublisher, фильтры по SubPublisher)

Моя проблема в том, что я не могу заставить ModelChoiceField выбрать соответствующего издателя из списка издателей.

Примечание: Publisher & SubPublisher предназначены только для фильтрации по библиотекам - и это работает, проблема заключается только в установке начальных значений в соответствии с выбранными ключами ForeignKeys библиотеки

Что мне не хватает?

Спасибо заранее!

1 Ответ

0 голосов
/ 03 сентября 2018

Я понял это. Публикация, так что это будет полезно для других.

Переопределить ModelForm Функция init выглядит так:

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if kwargs['instance']:
            model_instance = kwargs['instance']

Затем используйте идентификаторы, выбранные из экземпляра модели, чтобы переопределить начальные данные полей ModelForm, вот пример из вопроса:

            if hasattr(model_instance, 'library') \
                and hasattr(model_instance.library, 'subpublisher_id'):
            subpublisher_id = model_instance.library.subpublisher_id
            self.fields['subpublisher'].initial = subpublisher_id
            if hasattr(model_instance.library, 'subpublisher') \
                    and hasattr(model_instance.library.subpublisher, 'publisher_id'):
                publisher_id = str(model_instance.library.subpublisher_id.publisher_id)
                self.fields['publisher'].initial = publisher_id
...