Uma maneira ainda melhor de lidar com formulários Django

Existe uma dica profissional “Melhor maneira de inicializar formulários Django” , que é uma boa dica de como lidar com formulários em menos código, mas não mostra como tornar sua visualização mais personalizável.

Em vez da maneira comum:

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,
})

Eu geralmente faço a seguir:

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,
})

Os lados positivos são:

  • a classe de formulário e o nome do modelo permitem personalizar sua visualização sem bifurcar seu aplicativo – apenas manipulando urls em um aplicativo ext especial.
  • Mover o processamento dos dados do formulário para form.save (), permite também personalizar o processamento por herança da classe do formulário, não por reescrever todas as funções de visualização
  • use o redirecionamento para redirecionar para um nome de url específico, não para o url. Os URLs tendem a mudar com o tempo.
  • TemplateResponse – retorna o objeto preguiçoso, que será renderizado posteriormente, e pode ser personalizado por decoradores ou middlewares.