I’m Lazier Then Django Forms
by Hose-A S-Warez • Published 17 Jan 2009
When I started to learn django, i fell in love with django forms, or newforms as it was called then. It made writing forms a lot more enjoyable. So like many relationship, it started out great, we, (me and django forms), were having a great time together, having fun spending a lot of time together, great. Then we started to get serious and that’s when things became more complicated.
I found myself using copy and paste a lot, from one form to another form. Sure it did the job, but it required more effort then I wanted to give. I had to give it a couple looks each time to ensure everything was correct. It got tedious, and i have to blame django forms for this. It has spoiled me, making things to easy to use. I can’t imagine trying to write out forms like I once did in .NET.
So as our relationship continued we found our selves in the same cycle, everything the same. But I wanted more, I wanted to us to be in love again. Like we were when we first meet.
Solution - Form Options
class FormOptions(): """ FormOptions class gives Form extra properties so we can build a generic form template and relieve the need to re-create a form, even more lazier then newforms. """ (id, method, action, enctype, accept, accept_charset, cssclass, has_reset, include_help_text, submit_label, reset_label) = (None, None, None, None, None, None, None, None, None, None, None) def __new__(self, id=None, method='POST', action='.', enctype=None, accept=None, accept_charset=None, cssclass='form_wrapper', has_reset=False, include_help_text=False, submit_label='Submit', reset_label='Reset'): if not action: raise ValueError('Action is not defined.') (self.id, self.method, self.action, self.enctype, self.accept, self.accept_charset, self.cssclass, self.has_reset, self.submit_label, self.reset_label, self.include_help_text) = (id, method, action, enctype, accept, accept_charset, cssclass, has_reset, submit_label, reset_label, include_help_text)
Very simple, yes. But that’s not all, I also made a template tag…
@register.inclusion_tag('core/form.html') def build_form(form): return { 'form': form }
And then the forms.html template…
{% if form.options %} <div{% if form.options.cssclass %} class="{{ form.options.cssclass }}"{% endif %}> <form action="{{ form.options.action }}" {% if form.options.id %} id="{{ form.options.id }}"{% endif %} {% if form.options.method %} method="{{ form.options.method }}"{% endif %} {% if form.options.type %} type="{{ form.options.type }}"{% endif %} {% if form.options.enctype %} enctype="{{ form.options.enctype }}"{% endif %} {% if form.options.accept %} accept="{{ form.optons.accept }}"{% endif %} {% if form.options.accept_charset %} accept_charset="{{ form.options.accept_charset }}"{% endif %}> {% endif %} {% if form.errors %} <div class="error"> There was errors, please correct them and try again. </div> {% endif %} {% if form.non_field_errors %} {% for error in form.non_field_errors %} <div class="error">{{ error }}</div> {% endfor %} {% endif %} {% for field in form %} <fieldset> {% if field.errors %} <div class="error">{{ field.errors }}</div> {% endif %} {{ field.label_tag }} {{ field }} {% if form.options and form.options.include_help_text %} <div class="field_help">{{ field.help_text }}</div> {% endif %} </fieldset> {% endfor %} {% if form.options %} <fieldset> <input{% if form.options.submit_id %} id="{{ form.options.submit_id }}"{% endif %} type="submit" name="submit" value="{{ form.options.submit_label }}" /> {% if form.options.has_reset %} <input{% if form.options.reset_id %} id="{{ form.options.reset_id }}"{% endif %} type="reset" name="reset" value="{{ form.options.reset_label }}" /> {% endif %} </fieldset> {% endif %} {% if form.options %} </form> </div> {% endif %}
The last step is to add the FormOptions class to your form like below…
class paste_form(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput(), required=False, help_text='Optional, password protect this code.') type = forms.ChoiceField(choices=code_types, help_text=mark_safe(code_type_help_text)) options = FormOptions()
And anywhere I need a form on my page, it will look like this…
{% load defaulttags %} {% build_form form1 %} {% build_form form2 %}
And so, me and django forms are now back in love.
blog comments powered by Disqus