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 passThis 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... passThis 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 :-)
No comments:
Post a Comment