My last post presented a way of generating dynamic classes in python. Today I would like to present a way of applying this mechanism to Django forms, making them a bit generic. An example may be a login form, that may be used with an "accept regulations" checkbox or without it, depending on the context.
class LoginForm(forms.Form):
username = forms.CharField(max_length=20, label="Username")
password = forms.CharField(widget=forms.\
PasswordInput(render_value=False),max_length=20, label="Password")
def clean(self):
#form validation/clean implementation
pass
This a simplest login form you can get, all there is to do is to implement a login mechanism (or simply use it, it's available at the
django.contrib.auth module). Both provided fields are required,
so the
is_valid method will generate an appropriate result. Now let's make a possibility to generate this form with an "accept regulations" which is also required.
class LoginForm(forms.Form):
username = forms.CharField(max_length=20, label="Username")
password = forms.CharField(widget=forms.\
PasswordInput(render_value=False),max_length=20, label="Password")
def clean(self):
#form validation/clean implementation
pass
@classmethod
def with_accept_regulations(cls):
return type(
"%sWithAcceptRegulations" % cls.__name__,
(cls,),
{"accept_regulations" : forms.BooleanField(required=True, \
label="I accept the regulations")},
Now we may easily obtain a login form with accept regulations using the
with_accept_regulations class method. Example usage is presented below:
if something:
CurrentLoginForm = LoginForm
else:
CurrentLoginForm = LoginForm.with_accept_regulations()
form = CurrentLoginForm(request.POST)
if form.is_valid():
#and os on...
pass
This example is trivial, and a similar outcome may be achieved by using simpler mechanisms, however examples are suppose to be simple. This method may be applied to more demanding applications, a huge feature is the ability to chain class creation methods, for example you could try implementing the following:
LoginForm.with_accept_regulations().with_skin_selection(), which would generate a class
LoginFormWithAcceptRegulationsWithSkinSelection. I know this is starting to look like java, but the long names are meant to be descriptive :-)
Have fun exploring new possibilities.
Cheers!
KR
P.S.
I was in a hurry, so the code may have some simple mistakes - beware :-)