Even better way to handle Django forms
There is a pro tip "Better Way To Initialize Django Forms", which is a good tip how to handle forms in less code, but don't show how to make your view more customizable.
Instead of common way:
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# Process the data in form.cleaned_data
return HttpResponseRedirect('/thanks/')
else:
form = ContactForm()
return render(request, 'contact.html', {
'form': form,
})
I usually do next:
def contact(request, form_class=ContactForm, template_name='app_name/contact.html'):
form = form_class(request.POST or None)
if form.is_valid():
form.save()
return redirect('thanks_url')
return TemplateResponse(request, template_name, {
'form': form,
})
Positive sides are:
- formclass and templatename allows to customize your view without forking your app - just by manipulating urls in special ext app.
- Moving processing of form data to form.save(), allows as well to customize processing by inheritance of form class, not by rewriting all view function
- use redirect for redirecting to specific url name, not url. Urls are tend to change over time.
- TemplateResponse - returns lazy object, that will be rendered later, and can be customized by decorators or middlewares.
Written by Illia Polosukhin
Related protips
2 Responses
I'm going to update my Django forms right now....OK, maybe after I drink a Tab :)
over 1 year ago
·
Or you could use Class based FormView.. much nicer :)
over 1 year ago
·
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Python
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#