Если у вас менее 20 форм, кажется, что составление словаря - самый простой способ. Джанго тоже делает подобные вещи внутренне.
Для ModelForms
администратор django просто создает их на лету с помощью modelform_factory
, поэтому нет способа, сравнимого с get_model
Понятно, ваш метод является пуленепробиваемым, но требует строки в любой модели.
Если у вас есть только один ModelForm
на model
, вы потенциально можете перебирать подклассы ModelForm
, пока не найдете свою форму.
найти FooModelForm, когда меня представят
с FooModel или даже строкой
"Foo".
modelforms = forms.ModelForm.__subclasses__()
def get_modelform(model):
try:
return filter(lambda x:x.Meta.model == model, modelforms)[0]
except IndexError:
print "apparently, there wasn't a ModelForm for your model"
Если вы хотите вытянуть ModelForm
как строку, вам нужно убедиться, что оба
app_label
и __name__
верны, что означает, что будет проще использовать get_model('app', 'model')
в функции.
Вы можете комбинировать это с вашим методом и автоматически размещать атрибут в ваших моделях, который указывает на его ModelForm.
Подключите сигнал class_prepared
вверху ваших приложений, найдите соответствующий ModelForm
и присоедините его к вашему классу Model.
Надеюсь, что это помогает или дает вам некоторые идеи.