Olá pessoal, no meu ultimo artigo Excluindo e atualizando os dados ModeForm eu cometi um erro, não coloquei no artigo e nem no exemplo a função para alterar os dados, então ele fico apenas adicionando e excluindo os dados. Para corrigir isso eu vou por meio desse artigo explicar passo a passo todas as operações de um formulário básico em Django usando ModelForm.
O código fonte do exemplo você pode encontrar no final desse artigo.
Crie um projeto e uma aplicação novos, nesse artigo o nome do projeto vai ser "tutorial" e o nome da aplicação é "tuto2".
Vamos ao nosso models.py:
# -*- coding: utf-8 -*-
from django.db import modelsclass Clientes(models.Model):
cli_codigo = models.AutoField('Código', primary_key=True, db_index=True)
cli_nome = models.CharField('Nome', db_index=True, max_length=100)
cli_fantasia = models.CharField('Fantasia', db_index=True, max_length=100)
class Admin:
pass
def __unicode__(self):
return self.cli_nome
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.newforms import ModelForm
from tutorial.tuto2.models import Clientes
def index(request):
clientes = Clientes.objects.all()
return render_to_response('index.html', {'clientes':clientes,})
Nossa próxima função é a “adicionar_cliente”:
def adicionar_cliente(request):
if request.POST:
f = ClientesModelForm(request.POST)
if f.is_valid():
c = f.save()
return HttpResponseRedirect(reverse('tutorial.tuto2.views.index'))
else:
return HttpResponse(f.errors)
else:
f = ClientesModelForm()
return render_to_response('adicionar_cliente.html', {'form':f.as_table(),})
Vamos para a função “alterar_cliente”:
def alterar_cliente(request, codigo):
cliente = get_object_or_404(Clientes, pk=codigo)
f = ClientesModelForm(request.POST, instance=cliente)
if f.is_valid():
cliente = f.save()
return HttpResponseRedirect(reverse('tutorial.tuto2.views.index'))
else:
return HttpResponse(f.errors)
A função “apagar_cliente”:
def apagar_cliente(request, codigo):
cliente = get_object_or_404(Clientes, pk=codigo)
cliente.delete()
return HttpResponseRedirect(reverse('tutorial.tuto2.views.index'))
Mostrando os dados de um cliente no formulário para que possamos alterar ou excluir o cliente selecionado com a função “mostra_dados_cliente”:
def mostra_dados_cliente(request, codigo):
cliente = get_object_or_404(Clientes, pk=codigo)
codigo = cliente.cli_codigo
f = ClientesModelForm(instance=cliente)
return render_to_response('cliente_dados.html', {'form':f.as_table(), 'codigo':codigo})
A classe “ClientesModelForm” é a responsável por gerar os formulários html com base em nosso model, no caso “Clientes”.
class ClientesModelForm(ModelForm):
class Meta:
model = Clientes
Não explicarei aqui sobre o urls.py pois ela esta bem simples de se entender, mas mesmo que tenha duvidas fique a vontade para comentar, segue o código das urls:
(r'^admin/', include('django.contrib.admin.urls')),
(r'^$', 'tutorial.tuto2.views.index'),
(r'^adicionar_cliente/$', 'tutorial.tuto2.views.adicionar_cliente'),
(r'^alterar_cliente/(?P<codigo>\d+)/$', 'tutorial.tuto2.views.alterar_cliente'),
(r'^apagar_cliente/(?P<codigo>\d+)/$', 'tutorial.tuto2.views.apagar_cliente'),
(r'^mostra_dados_cliente/(?P<codigo>\d+)/$', 'tutorial.tuto2.views.mostra_dados_cliente'),
Vamos aos códigos das paginas html:
index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Tutorial RFDev.org</title>
</head>
<body>
<a href="/adicionar_cliente/">Adicionar Cliente</a><br /><br />
{% for clientes in clientes %}
<a href="/mostra_dados_cliente/{{ clientes.cli_codigo }}/">{{ clientes.cli_nome }}</a><br />
{% endfor %}
</body>
</html>
adicionar_cliente.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>Tutorial RFDev.org</title>
</head>
<body>
<form action="/adicionar_cliente/" method="post">
<table>
{{form}}
</table>
<input type="submit" value="Adicionar"/>
</form>
</body>
</html>
cliente_dados.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>Tutorial RFDev.org</title>
</head>
<body>
<form action="/alterar_cliente/{{ codigo }}/" method="post">
<table>
{{form}}
</table>
<input type="submit" value="Salvar"/>- <a href="/apagar_cliente/{{ codigo }}/">Excluir</a>
</form>
<a href="/">Voltar</a>
</body>
</html>
Espero que aproveitem e estou a disposição para tirar as duvidas e discutir sobre o artigo.
Até a próxima!
Código fonte exemplo: exemplo
OK! Testado e funcionando.
Achei muito interessante sua divulgação e ainda mais a correção.
Isto demonstra que nao só seu entusiasmo como também seu apoio.
Porisso venho pedir ajuda;
Tentei incluir em meu projeto e apareceu erro tentei encontrar uma solução mas sem sucesso, então fiz exatamente como o exemplo, mas o erro é o mesmo:"Exception Value: __init__() takes at least 2 arguments (1 given)" ao tentar adicionar clientes.
Será que poderia me ajudar neste caso?
Agradeço antecipadamente
Feeds RSS
Ultimas Mensagens
Tags (categorias)
Links
Histórico