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.