Take this very simple form for example:
class SearchForm(Form):
q = forms.CharField(label=\'search\')
This gets rendered in the templat
Look at the widgets documentation. Basically it would look like:
q = forms.CharField(label='search',
widget=forms.TextInput(attrs={'placeholder': 'Search'}))
More writing, yes, but the separation allows for better abstraction of more complicated cases.
You can also declare a widgets attribute containing a mapping directly on the Meta of your ModelForm sub-class.