21
votes

I need to dynamically create a class. To go in futher detail I need to dynamically create a subclass of Django's Form class.

By "dynamically" I intend to create a class based on configuration provided by a user.


e.g.

I want a class named CommentForm which should subclass the Form class.

The class should have a list of chosen attributes.

....in this case

name = forms.CharField()
comment = forms.CharField(widget=forms.Textarea())

Any useful tips? :)

2
"I need to dynamically create a class." This is so rarely needed that you have to provide a lot more information in order for this question to make sense. - S.Lott

2 Answers

34
votes

You can create classes on the fly by calling the type built-in, passing appropriate arguments along, like:

CommentForm = type("CommentForm", (Form,), { 
    'name': forms.CharField(),
    ...
})

It works with new-style classes. I am not sure, whether this would also work with old-style classes.

13
votes

Classes can be defined almost anywhere.

def newclass(val):
  class C(object):
    def __str__(self):
      return str(val)
  return C

MyClass = newclass(5)
m = MyClass()
print str(m)