Попытка написать завод по производству хрустящих форм
Я пытаюсь написать фабрику форм для возврата форм Crispy с соответствующим объектом-помощником. Вот что у меня получилось. Кажется, что это работает, но также кажется неэлегантным.
def crispy_form_factory( schema):
namespace = { '_schema': schema }
for key, info in schema:
# details omitted. I know this works because I've been using it without crispy.
# it populates the namespace with things like
namespace[key] = forms.Charfield( **kwargs)
## where kwargs is generated based on info from the schema dict
form_class = type('Schema_Form', (forms.Form,), namespace )
class Crispier( form_class):
def __init__( self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper=FormHelper(self) # Crispify
self.helper.layout = make_layout( self._schema)
return Crispier
Что я надеялся сделать, так это определить внутреннюю функцию
def init(self, *args, **kwargs):
super().__init__( *args, *kwargs)
self.helper = FormHelper( self)
self.helper.layout = make_layout( self._schema)
namespace['__init__'] = init
return type('Crispy_PRSBlock_Form', (forms.Form,), namespace )
но "магия" super()
не работает, когда используется таким образом.
Каким элегантным способом можно внедрить объект макета Crispy в функцию фабрики форм? (Ответ может лежать в метаклассах Python, которые я, признаться, не очень понимаю)
Элегантность в сторону, есть ли какие-либо конкретные причины, почему не делать это так, как я нашел, который, кажется, работает?