get_model эквивалент для ModelForms? - PullRequest
3 голосов
/ 17 июля 2010

У меня есть несколько классов ModelForm, каждый из которых представляет свою модель.Я хотел бы иметь общую функцию «создать», которая загружает указанную форму модели на основе параметра URL.Можно динамически загрузить модель следующим образом:

model_name = 'TestModel'
m = get_model('AppLabel', model_name)

Кто-нибудь знает, как я могу добиться того же для ModelForms, что-то вроде:

modelform_name = 'TestModelForm'
f = get_form('AppLabel', modelform_name)
if f.is_valid():
    ...

Я не могу думать оспособ сделать это с помощью общих представлений - они требуют передачи ModelForm, а не только ее имени.Если я получу модель с помощью get_model, то передам ее в общий вид, она отобразит форму, но я не могу исключить поля модели.

TIA для любых советов

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Когда вы создаете ModelForm, он не регистрируется в приложении своей модели. (На основе опыта и быстрого просмотра источника).

Вот некоторые другие мысли, которые я могу придумать:

  1. Все классы ModelForm существуют в одном модуле: Используйте getattr в этом модуле на основе строки.

  2. ModelForm разбросаны по многим моделям, и у вас есть разумное (<30) количество форм: </strong> Создайте отображение словаря из ожидаемых строк формы в классы ModelForm. Например:

    from some_app.forms import FirstModelForm
    from another_app.forms import SecondModelForm
    from additional_app.forms import FirstModelForm as AdditionalAppFirstModelForm # Will allow for managing conflicting names easily.
    
    form_mapping = {
        'FirstModelForm': FirstModelForm,
        'SecondModelForm': SecondForm,
        'AdditionalAppFirstModelForm': AdditionalAppFirstModelForm,
    }
    
    request_form_class = request.POST.get('form_class')
    f = form_mapping.get(request_form_class)(request.POST)
    
    if f.is_valid():
        f.save()
    
  3. Вы имеете дело с множеством форм : создайте базовый класс для вашей ModelForm или замените BaseModelFormMetaclass во время выполнения. Вам придется иметь дело с такими проблемами, как конфликты имен, дублирование ModelForm s для того же Model «автоматически», так что готовьтесь к некоторым головным болям. Было бы неплохо, если бы вы справились.

Лично (как вы, наверное, видите) я бы просто выбрал вариант 2.

0 голосов
/ 06 июня 2015

Альтернативный метод для этого - заменить forms.py пакетом с именем forms. Затем в __init__.py внутри этого пакета импортируйте все свои ModelForm s.

Тогда вы можете использовать опцию sdolan # 1.

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