Создайте пользовательское поле Django, которое на самом деле является формой - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть немного сложная вещь, которую можно описать так: мне нужно создать форму с несколькими формами (и наборами форм), но эта форма должна вести себя как обычная форма, и мне нужно сохранить все эти формыс одной кнопкой «сохранить».Нечто подобное уже было реализовано в библиотеке django-superform здесь .Из-за ограничений я не могу просто взять какую-то библиотеку и использовать ее, но я должен реализовать ее самостоятельно.

Я попробовал этот подход, и он работает, но он действительно грязный из-засторона семантики: я должен передать inlineformset_factory некоторые объекты как родительские объекты, но на самом деле они не являются родителями этих объектов.Я просто должен дать пользователям возможность работать с другими сущностями, связанными с какой-то другой сущностью.

Так что я думаю о более общем подходе.Моя идея проста: я создаю форму с полями, и что поля на самом деле формы, каждая из этих форм имеет два поля: одно по умолчанию Django ModelForm и другое по умолчанию Django Formset.

Итак, у меня есть 3 вложенныхУровни:

class MainForm(forms.Form):
  system_1 = SystemOneFormField(prefix='system1')
  system_2 = SystemTwoFormField(prefix='system2')
  system_3 = SystemThreeFormField(prefix='system3')

class SystemOneFormField(forms.Form):
  general_fields = GeneralFormField(prefix='general')
  multiple_fields = MultiFields(prefix='multi') # one-to-many

class GeneralFormField(forms.ModelForm):
   class Meta:
        model = SystemOneGeneralModel

MultiFields = modelformset_factory(model=SystemOneMultiFieldModel)

System2 и System3 имеют одинаковую идею и немного более просты, поэтому я просто пропускаю их описание.

Вопрос в том, приемлем ли этот подход в терминах Django?Я вижу некоторые проблемы с валидацией и инициализацией подполей, а также похоже, что мне нужно реализовать пользовательские методы сохранения и удаления.Я просто не уверен, что можно сделать форк django с другой формой или набором форм как поле.

Я использую django 1.6 и python 2.7, если это важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...