segunda-feira, 1 de fevereiro de 2016

Como utilizar o "Salvar e adicionar outro" do Admin no Front com Class-Based Views

O botão de Salvar e Adicionar outro é muito útil no administrativo quando se faz necessário inserir uma lista de dados em algum modelo.

No front, quando o usuário tem permissão de inserir algo para persistir o banco, também é possível utilizar este recurso. Vejamos como:

views.py

class SuaClasseCreateView(CreateView):
	form_class = SuaClasseForm
	success_url = '/url-de-sucesso/'
	template_name = 'form.html'
	model = SuaClasse

	def post(self, request, *args, **kwargs):

		form_class = self.get_form_class()
		form = self.get_form(form_class)

		if form.is_valid():

			if request.POST.get('_addanother'):
				self.success_url = '/url-de-nova-insercao/'

			return self.form_valid(form)
		else:
			return self.form_invalid(form)


	def form_valid(self, form):
		form.save()
		return HttpResponseRedirect(self.success_url)

	def form_invalid(self, form):
		return self.render_to_response(
			self.get_context_data(form=form)
		)



class SuaClasseUpdateView(UpdateView):
	form_class = SuaClasseForm
	model = SuaClasse
	success_url = '/url-de-sucesso/'
	template_name = 'form.html'


	def post(self, request, *args, **kwargs):
		self.object = self.get_object()
		form_class = self.get_form_class()
		form = self.get_form(form_class)
		form.instance = self.object

		if form.is_valid():

			if request.POST.get('_addanother'):
				self.success_url = '/url-de-nova-insercao/'

			return self.form_valid(form)
		else:
			return self.form_invalid(form)


	def form_valid(self, form):
		form.save()
		return HttpResponseRedirect(self.success_url)

	def form_invalid(self, form):
		return self.render_to_response(
			self.get_context_data(form=form)
		)

As views acima funcionam para qualquer modelo, sem nenhuma alteração nos forms.py. No html, apenas é necessário incluir o botão de Salvar e adicionar outro como exemplo abaixo:

form.html
<input type="submit" name="_addanother" value="Salvar e adicionar outro(a)">


Quando o clique é feito neste botão, o value dele é enviado via post, e a tratativa disso está no método post da view. Quando não é clicado, o valor não é enviado, não redirecionando assim para uma nova tela com o formulário aberto.

hasta!