Excluindo e atualizando os dados ModelForm

Postado em: Janeiro 11, 2008
Tags: django

OBS: Uma versão mais atualizada desse artigo esta em http://rfdev.org/2008/02/21/formularios-no-django/

Dando continuidade ao tutorial Usando NewForms com ModelForm vou complementá-lo com as funções de excluir e alterar os registros.

Vamos começar pelo nosso “contatos.html” ele vai ser o único html que vamos usar, o “contatos_lista.html” não iremos mais usar então ele pode ser descartado.
O “contatos.html” deve ficar como a baixo:

<html>
<head>
<title>Newforms Django</title>
</head>
<body>
{% if nome %}
<p>{{ nome }} foi deletado!</p>
{% endif %}
<form action="/salvar_contato/" method="post">
<table>
{{form}}
</table>
<input type="submit" value="Adicionar/Salvar" /> - <a href="/apagar_contato/{{ codigo }}/"> Excluir</a>
</form>
{% for contatos in c %}
<a href="/contatos_resultado/{{ contatos.id }}/">{{ contatos.nome }}</a><br />
{% endfor %}
</body>
</html>

Como você pode reparar foram adicionadas algumas linhas ao nosso html, vou explicar o que cada uma faz:

{% if nome %}
<p>{{ nome }} foi excluido!</p>
{% endif %}

Nesse trecho de código eu estou verificando se existe algum nome na variável “nome”, se existe algum nome o
<p>{{ nome }} foi excluido!</p>
ira ser mostrado na tela como, por exemplo, “Rafael foi excluido!” nesse caso a variável “nome” continha a string “Rafael”.
<form action="/salvar_contato/" method="post">
<table>
{{form}}
</table>
<input type="submit" value="Adicionar/Salvar" /> - <a href="/apagar_contato/{{ codigo }}/"> Excluir</a>
</form>

Aqui esta nosso formulário, nesse trecho é aonde os nossos campos iram aparecer é aonde iremos incluir, salvar e excluir os registros. Nossa variavel {{ form }} é a que vai fazer a mágica de gerar todos os campos para nós, os label's e edit's. Reparem em
action=”/salvar_contato/” method=”post”
essa parte de código html quer dizer que a região do <form> tem o método “post” que quer dizer que ao clicar em um botão com o tipo “submit” ele ira enviar os dados do {{ form }} para a função “salvar_contato”. Temos também um link no qual recebe o endereço da pagina mais a função e mais o código para deletar o contato selecionado.
{% for contatos in c %}
<a href="/contatos_resultado/{{ contatos.id }}/">{{ contatos.nome }}</a><br />
{% endfor %}

Agora vamos listar os contatos já incluídos, com esse “for” eu estou fazendo um laço em todos os registros do objeto “c” e os atribuindo para “contatos” e com isso eu monto um link com cada registro encontrado.

Agora vamos para o urls.py,ele deve ficar assim:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^admin/', include('django.contrib.admin.urls')),
(r'^contatos/', 'tutorial.tuto1.views.contatos'),
(r'^salvar_contato/$', 'tutorial.tuto1.views.salvar_contato'),
(r'^contatos_resultado/(?P<codigo>\d+)/$', 'tutorial.tuto1.views.contatos_resultado'),
(r'^apagar_contato/(?P<codigo>\d+)/$', 'tutorial.tuto1.views.apagar_contato'),
)


Foi adicionado a ultima linha que é a que chama a função de excluir um contato.
No nosso views.py vou mostrar o que foi alterado:
def contatos(request):
c = Contatos.objects.all()
f = ContatosModelForm()
return render_to_response('contatos.html',{'form':f.as_table(), 'c':c})

Foi adicionado o “c = Contatos.objects.all()” com isso eu pego todos os registros dos contatos e jogo eles para a variável “c” que no fim é enviado para o contatos.html como pode ser visto em “'c':c”
def contatos_resultado(request, codigo):
c = get_object_or_404(Contatos, pk=codigo)
codigo = c.id
f = ContatosModelForm(instance=c)
c = Contatos.objects.all()
return render_to_response('contatos.html',{'form':f.as_table(), 'c':c, 'codigo':codigo})

Aqui foi adicionado as linhas:

codigo = c.id
f = ContatosModelForm(instance=c)
c = Contatos.objects.all()

E alterado o:
return render_to_response('contatos.html',{'form':f.as_table(), 'c':c, 'codigo':codigo})

Aqui é simples, pegamos o id do contato, depois pegamos o modelform e atribuímos uma instancia do objeto Contatos já com os valores do contato selecionado para que os campos sejam preenchidos com os dados do contato selecionado e depois pegamos todos os registros dos contatos e mandamos para a variável “c”, antes ela continha apenas um registro e usamos ela apenas para pegar o código do contato e agora estamos carregando ela com todos os contatos para que eles apareçam na página listados.
def apagar_contato(request, codigo):
c = get_object_or_404(Contatos, pk=codigo)
nome = c.nome
c.delete()
f = ContatosModelForm()
c = Contatos.objects.all()
return render_to_response('contatos.html',{'form':f.as_table(), 'nome':nome, 'c':c})

Essa é uma função nova, é ela que vai excluir o contato selecionado, primeiro pegamos o contato, guardamos o nome dele na variável “nome” que vai ser usada no html para mostrar o nome do contato que foi excluído, e depois executamos o “delete()” para excluir o contato. Pegamos o ModelForm e depois os registros dos contatos e enviamos para o “contatos.html”
Era isso, agora só depois que eu voltar das minhas ferias :)

Download do fonte: contatos

Abraços!



Não será divulgado!

Um site válido!

Renata em Fevereiro 20, 2008

Boa tarde,
Estou trabalhando com o django e seus artigos tem sido de grande ajuda. Teria algum material sobre como alterar formulario, pois nesse último ele altera, porém salva outro, em vez de salvar por cima.

Grata

Rafael C. de B. em Fevereiro 20, 2008

Renata vc tem razão, estarei hj mesmo fazendo outro artigo abordando todas as 3 operações e dessa vez farei com calma pois esse artigo eu fiz nas preças e acabei nao me ligando de que ele estava adicionando ao invés de alterar, peço desculpas a todos que acompanharam esse artigo e se depararam com esse problema.

Outros

Hospedagem gratuitamente cedida pela TeHospedo - Hospedagem de sites, registro de dominios, revenda de hospedagem, streaming
TeHospedo - Hospedagem de sites, registro de dominios, revenda de hospedagem, streaming

django donated

pyconbrasil

Divulgue o Nerdson

Firefox 3 - Brazil

BlogBlogs

Add to Technorati Favorites

Django
Desenvolvido com Django, Aptana, Gimp, Inkscape | Rafael Campos de Bastiani - RFDev.org - 2008