Package: django-viewform
===============django-viewform===============Template driven form rendering for djangoFeatures========* Strong python/html code separation* Easy redefinition of particular fields rendering* Complex form layout support* Formsets and js goodies out of the boxDemo: http://forms.viewflow.io/Installation============django-viewform tested with Python 2.7/3.3, django 1.6/1.7::pip install django-viewformAnd add it into INSTALLED_APPS settingsINSTALLED_APPS = (...'viewform',)Quick start===========Include formpack javascript and styles into your base template{% include 'viewform/bootstrap3/include_css.html' %}{% include 'viewform/bootstrap3/include_js.html' %}Packs for bootstrap3 and foundation5 are available out of the boxRender your form with {% viewform %} template tag<form method="POST">{% csrf_token %}{% viewform 'viewform/bootstrap3/form.html' form=form %}{% endviewform %}<button type="submit" name="_submit" class="btn">Submit</button></form>Template tags=============`viewform` is built around simple concept called viewpart. `Viewpart`is like django template block, it has a default value and could beoverriden.  But `viewparts` are created dynamically for each formfield, which allows you to redefine specific form field html render output.Here is the example of rendering form with predefined bootstrap template,but prepend email field with `@` sign.<form method="POST">{% csrf_token %}{% viewform 'viewform/bootstrap3/form.html' form=form layout=view.layout %}{% viewpart form.email.field prepend %}<div class="input-group-addon">@</div>{% endviewpart %}{% endviewform %}<button type="submit" name="_submit" class="btn">Submit</button></form>There is a lot of other viewparts declared in default templates. See template code for details.If your widget is so special, just provide `{% viewpart form.my_field.field %}any html code{% endviewpart %}`Layout======Layout object is the way to specify relative fields placements and sizes.from viewform import *layout = Layout(Row('shipment_no', 'description')Fieldset("Add to inventory",Row(Span3('product_name'), 'tags'),Row('vendor', 'product_type'),Row(Column('sku','stock_level',span_columns=4),'gender', 'desired_gender'),Row('cost_price', Span2('wholesale_price'), 'retail_price')))SpanXX elements are not directly mapped to bootstrap or foundation gridclasses, but used to determine relative fields width. Each row occupies12 grid columns.  Elements in Row('elem1', 'elem2') would be renderedin 6 grid coulmns each, and in Row(Span2('elem1'), 'elem2') `elem1`would be rendered in 8 grid columns, and `elem2` in 4 grid columns.Layouts rendering itself is specified in template. Seetemplates/viewform/<tempalte_pack>/layout code folder for details.ModelForm Views===============Viewform library provides  LayoutMixin for model form views, populatesform fields list directly from layout objectfrom django import genericfrom viewform import LayoutMixinclass SampleView(LayoutMixin, generic.ModelFormView):layout = Layout(...)Formset and inlines===================With django-extra-views NamedFormsetsMixin you can use inline names inside viewform layoutclass FormsetView(LayoutMixin,extra_views.NamedFormsetsMixin,extra_views.CreateWithInlinesView):model = Shipmentclass ItemInline(extra_views.InlineFormSet):model = ShipmentItemfields = ['name', 'quantity']layout = Layout(Row(Column('name', 'city'),Column('address_line1', 'address_line2')),Inline('Items', ItemInline))Changelog=========0.1.0 2014-11-05 - Alpha------------------------* First alpha version extracted from `Viewflow <http://viewflow.io>`_ library* Initial bootstrap3 and foundation5 support* Basic django widgets supportLicense=======Viewform code and html templates licensed under `LGPL <https://www.gnu.org/licenses/lgpl.html>`_Components (bootstrap/foundation/jquery and etc) have own licenses. Referer to the source code for the details.