Criando formulário a partir de dois modelos de dados

1,299 views
Skip to first unread message

contatog...@gmail.com

unread,
May 19, 2011, 4:47:06 PM5/19/11
to django...@googlegroups.com
Olá pessoal,

Eu estou com uma dúvida aqui. Tem como eu criar um formulário a partir do ModelForm com dois modelos de dados? Por exemplo:

- Modelo B tem um campo que é uma chave estrangeira do Modelo A;

Com isso eu queria passar todos os campos do Modelo A para preencher mais os do Modelo B.

Tem como fazer isso?
_____________________________________________
Gilson Filho
Web Developer
http://gilsondev.com

Adriano Scherbach

unread,
May 20, 2011, 6:31:37 AM5/20/11
to Django Brasil
Você está falando de uma associação ou herança?

Acho que seria diferente para cada um.

On 19 maio, 17:47, "contatogilson...@gmail.com"
<contatogilson...@gmail.com> wrote:
> Olá pessoal,
>
> Eu estou com uma dúvida aqui. Tem como eu criar um formulário a partir do
> ModelForm com dois modelos de dados? Por exemplo:
>
> - Modelo B tem um campo que é uma chave estrangeira do Modelo A;
>
> Com isso eu queria passar todos os campos do Modelo A para preencher mais os
> do Modelo B.
>
> Tem como fazer isso?
> _____________________________________________
> *Gilson Filho*
> *Web Developerhttp://gilsondev.com*

contatog...@gmail.com

unread,
May 20, 2011, 8:55:00 AM5/20/11
to django...@googlegroups.com
Associação. Uma tabela teria um campos que seria um ID de um usuário cadastrado na tabela auth.user.

_____________________________________________
Gilson Filho
Web Developer
http://gilsondev.com




--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>

Rafael dos Santos Gonçalves

unread,
May 20, 2011, 8:56:18 AM5/20/11
to django...@googlegroups.com
Vê se é isso que você está querendo. vá para a sessão InlineModelAdmin


abs


Em 20 de maio de 2011 07:31, Adriano Scherbach <apsch...@gmail.com> escreveu:

contatog...@gmail.com

unread,
May 20, 2011, 9:05:17 AM5/20/11
to django...@googlegroups.com
Eu não uso o admin, você não entendeu. Eu tenho duas tabelas: Fornecedor e o User.

No meu sistema terá tres usuarios: Administrador, Fornecedor e Coordenador. O Fornecedor e o Coordenador tem sua classe que possui mais detalhes sobre esses perfis, mas o Administrador não precisa. Essas classes possuem um campo do tipo ForeignKey de User. Eu quero ao exibir o formulário de cadastro, trazer os campos de User e de Fornecedor, por exemplo, na mesma página. Quando cadastrar, quero que a view captura os dados desses dois modelos e inserir o id do usuário em Fornecedor automaticamente. O Django tem a opção de fazer essa "linkagem" de dois modelos de dados para fazer um só formulário?

_____________________________________________
Gilson Filho


Rafael dos Santos Gonçalves

unread,
May 20, 2011, 9:18:35 AM5/20/11
to django...@googlegroups.com
Acho que não, vc deveria criar dois forms e tratar isso, acho que n tem jeito automático de fazer isso.

abs

contatog...@gmail.com

unread,
May 20, 2011, 9:39:54 AM5/20/11
to django...@googlegroups.com
Tudo bem, mas posso criar um formulario com esses dois modelos juntos?

_____________________________________________
Gilson Filho
Web Developer
http://gilsondev.com



Rafael dos Santos Gonçalves

unread,
May 20, 2011, 9:48:25 AM5/20/11
to django...@googlegroups.com
Até onde eu sei não.

abs

Thiago Paulino

unread,
May 20, 2011, 9:51:44 AM5/20/11
to django...@googlegroups.com
Eu tenho uma dúvida parecida. No meu caso, uma classe Pessoa tem uma foreign key para uma classe Endereco.
No caso de cadastro de pessoa eu teria que fazer dois forms diferentes? Tipo, uma página pra cadastro de pessoa e outra pra cadastro de Endereco? Isso seria muito confuso pro usuário, o Django não tem nada que facilite isso? Não é possível... :/
Thiago P.
Graduando em Sistemas p/ Internet - IFPB
Pós-graduando em Desenv. p/ Dispositivos móveis - FatecJP
oxenteexception.wordpress.com
Twitter: @thiagopbr

contatog...@gmail.com

unread,
May 20, 2011, 9:55:56 AM5/20/11
to django...@googlegroups.com
È isso que quero fazer!

_____________________________________________
Gilson Filho


Thiago Paulino

unread,
May 20, 2011, 9:58:43 AM5/20/11
to django...@googlegroups.com
Eu encontrei um link que talvez possa ajudar: http://stackoverflow.com/questions/2563857/django-one-form-for-two-models-solved

Eu não analisei muito bem e nem tenho como testar agora porque estou no trabalho, vou tentar mais tarde. Se conseguir alguma coisa dá uma resposta aí Gilson.

Rael Max

unread,
May 20, 2011, 9:59:11 AM5/20/11
to django...@googlegroups.com
Não tenho certeza se é isso, mas dê uma olhada no formsets[1].

[1]http://docs.djangoproject.com/en/1.3/topics/forms/formsets/
Rael Max
Desenvolvedor Web.
<contato at raelmax.com>

contatog...@gmail.com

unread,
May 20, 2011, 10:02:01 AM5/20/11
to django...@googlegroups.com
Vou dar uma olhada. Dando certo eu falo. Valeu!

_____________________________________________
Gilson Filho


Ernesto Guevara

unread,
May 20, 2011, 10:52:07 AM5/20/11
to django...@googlegroups.com
Foi o que eu havia dito, eu excluo endereco do forms.py de funcionário e na views.py mando o form de funcionário e endereço.
_______________________________
forms.py

class FuncionarioForm(ModelForm):
     class Meta:         
        model = Funcionario
        exclude = ('endereco',)
________________________________

views.py

def formFuncionario(request):
    if request.method == 'POST':
        form = FuncionarioForm(request.POST) 
        formE = EnderecoForm(request.POST)   
        if form.is_valid() and formE.is_valid():
            endereco = formE.save()
            funcionario = form.save(commit=False)
            funcionario.endereco = endereco
            funcionario.save()
            messages.add_message(request, messages.SUCCESS, 'Funcionário cadastrado com sucesso!')
            return HttpResponseRedirect('/empresa/funcionario/lista/')
    else:
        form = FuncionarioForm()
        formE = EnderecoForm()
    return render_to_response('empresa/funcionario/formFuncionario.html', {'form': form, 'formE' : formE }, context_instance=RequestContext(request))

Mando dois forms pra html, form e formE.
Abraço!

Ernesto Guevara

unread,
May 19, 2011, 7:01:13 PM5/19/11
to django...@googlegroups.com
Olá!
Não ficou claro pra mim essa parte de passar campos de A para B.
Se o que vc quer é embutir o form de A em B, na existência de relacionamentos, o Django cria um select (combobox) do modelo relacionado automaticamente e não um form. Eu tb já tive essa necessidade mas não encontrei a resposta por enquanto.
Me disseram que deveria alterar o widget, mas não deu certo, então eu excluo o relacionado no forms.py e instancio dois forms na views.py, para ter assim um form abaixo do outro.
Abraço!


Rodrigo Chacon

unread,
May 20, 2011, 11:04:49 PM5/20/11
to django...@googlegroups.com
Não seria mais fácil criar um form simples que receba somentes os campos necessários e criar neste form um método save que faça o trabalho de salvar e linkar?

Vou tentar usar o caso do Gilson para tentar exemplificar, dado que ele não usa o admin e este método não se aplica ao admin:

Models: User, Fornecedor

Form:
class CadastroForm(forms.Form):
  usuario = forms.CharField()
  nome_fornecedor = forms.CharField()

  def save(self):
    user = User.objects.create(username=self.cleaned_data['usuario'])
    fornecedor = Fornecedor.objects.create(user=user, nome=self.cleaned_data['nome_fornecedor'])

View:
def view(request):
   form = CadastroForm(request.POST)
   # etc...

O Django não disponibiliza somente os ModelForm's, então não fiquem presos a eles. =D
Neste caso, você consegue cadastrar ambos os modelos em um único form, tratando validação erros e tudo o mais que precisar.

-- Rodrigo Chacon

Thiago Paulino

unread,
May 21, 2011, 10:14:06 AM5/21/11
to django...@googlegroups.com
Rodrigo, eu teria que declarar essa classe CadastroForm no models.py também? Se sim, não teria como deixar separado pra organizar melhor?

danilo silva dos santo

unread,
May 21, 2011, 5:17:18 PM5/21/11
to django...@googlegroups.com
 formWirzard ?

Rodrigo Chacon

unread,
May 23, 2011, 1:57:30 AM5/23/11
to django...@googlegroups.com
Thiago, é boa prática deixar seus forms em um arquivo forms.py dentro do seu app.

-- Rodrigo Chacon

Guilherme Kuhn

unread,
May 23, 2011, 7:46:29 AM5/23/11
to django...@googlegroups.com
Gilson, creio que seria um inline_formset [1] o que você busca. É bem simples de fazer e você pode customizar totalmente os forms de cada model. É desta forma que o admin faz os inlines, porém pode fazer fora do admin tranquilamente.

Ernesto Guevara

unread,
May 23, 2011, 10:08:55 AM5/23/11
to django...@googlegroups.com
Lembrando que para usar inline, a classe que será instanciada no form inline e que será injetado no form principal precisa estar anotada com ForeignKey. senão vai dar erro.
Abraço!

Thiago Paulino

unread,
May 23, 2011, 6:34:45 PM5/23/11
to django...@googlegroups.com
Ainda não consegui fazer o cadastro. :/
Como disse, eu tenho uma classe Pessoa que tem uma foreign key para Endereco e outra para Contato.

Meu código ficou da seguinte forma:
forms.py
class CadastroPessoaForm(forms.Form):
    pessoa_nome = forms.CharField()
    contato_email = forms.CharField()
    endereco_cep = forms.CharField() 

    def save(self):
        contato = Contato.objects.create(email=self.cleaned_data['contato_email'])
        endereco = Endereco.objects.create(cep=self.cleaned_data['endereco_cep'])       
        pessoa = Pessoa.objects.create(contato=contato, endereco=endereco, nome=self.cleaned_data['pessoa_nome'])

urls.py
url(r'^pessoa/cadastrar$','DjangoProject1.public.views.cadastro_pessoa'),

views.py
def cadastro_pessoa(request):
    campos = CadastroPessoaForm(request.POST)
    return render_to_response('generic_form.html',{'form':campos}, context_instance=RequestContext(request))

Quando eu entro pela url pessoa/cadastrar ele até exibe os campos pessoa_nome, contato_email e endereco_cep, que eu coloquei no CadastroPessoaForm, mas quando clico no botão cadastrar nada acontece. Acredito que eu não esteja fazendo a chamada para o método save(), como faço isso?
Alguém teria aí um exemplo completo já pronto de uma situação parecida com a minha? Iria ser de grande ajuda.

Thiago Paulino

unread,
May 23, 2011, 7:36:10 PM5/23/11
to django...@googlegroups.com
E outra coisa, ao invés de eu especificar cada campo, não tem como eu dizer "pegue todos os campos"?
Já to me descabelando por causa disso. hehe

Rodrigo Chacon

unread,
May 23, 2011, 8:23:02 PM5/23/11
to django...@googlegroups.com
Para pegar todas a variáveis locais da sua view para passar como contexto, use: locals(). Mas quase sempre você vai passar variáveis extras, desnecessárias para seu template, mantenha-se especificando cada uma.

Para a dúvida dos forms, tem bastante coisa aqui:

-- Rodrigo Chacon

Thiago Paulino

unread,
May 23, 2011, 9:46:40 PM5/23/11
to django...@googlegroups.com
Acabei de conseguir. o/
Mas confesso que não foi muito trivial. Achei que o django facilitaria pra mim. hehe
É preciso salvar os objetos "de baixo pra cima", digo, primeiro os que não tem foreign key, depois os que tem, enfim...
O importante é que consegui salvar o danado do objeto.
Obrigado pela ajuda de vocês.

Fabricio Mattos

unread,
May 23, 2011, 11:42:45 PM5/23/11
to django...@googlegroups.com
Ola Thiago,

teria como vc postar como ficou o codigo.

Estou tentando fazer isso aqui e estava acompanhando essa thread tentando fazer o que o pessoal escreveu, mas ainda não consegui salvar no banco .

Att

Fabricio

Thiago Paulino

unread,
May 24, 2011, 7:01:31 AM5/24/11
to django...@googlegroups.com
Opa, td blz?
Postei o código Django aqui: http://pastebin.com/DbQUZtSY e o formulário HTML aqui: http://pastebin.com/wL7hwETV
Eu comentei o código pra ficar melhor de entender.

Boa sorte!

Thiago Paulino

unread,
May 24, 2011, 11:14:08 PM5/24/11
to django...@googlegroups.com
Pessoal, na verdade ainda falta um  detalhe. :/
Eu consegui fazer tudo direitinho e tal, como já falei aqui, mas agora notei que faltou a parte de edição.
Antes eu estava fazendo da seguinte forma:

urls.py
    url(r'^pessoa/editar/(?P<object_id>\d+)$','django.views.generic.create_update.update_object',
        {'model':Pessoa, 'template_name':'generic_form.html','post_save_redirect' : '/pessoa/listar'}),

forms.py
<form action="/pessoa/editar/{{pessoa.id}}">
       {% csrf_token %}
       <input type="submit" value="Editar"/>
</form>

Isso eu fiz seguindo o tutorial do site do Django, mas ele exibe o form genérico. No meu caso, ele exibe os campos de contato e de endereco como dois combobox. Queria usar o form da mesma forma usado no cadastro.
O que devo alterar no meu código? Valeu.

Aniely Martins

unread,
May 25, 2011, 1:02:11 PM5/25/11
to Django Brasil
Estou com o mesmo problema do Gilson, quero atribuir automaticamente a
foreign key no mesmo form usando dois modelos, usei o
inlineformset_factory mas não atribui a chave .. quando eu tento
salvar diz que o campo nao pode ser nulo..
Alguém tem mais alguma dica?


On May 25, 12:14 am, Thiago Paulino <thiagopauli...@gmail.com> wrote:
> Pessoal, na verdade ainda falta um  detalhe. :/
> Eu consegui fazer tudo direitinho e tal, como já falei aqui, mas agora notei
> que faltou a parte de edição.
> Antes eu estava fazendo da seguinte forma:
>
> *urls.py*
>
> url(r'^pessoa/editar/(?P<object_id>\d+)$','django.views.generic.create_update.update_object',
>         {'model':Pessoa,
> 'template_name':'generic_form.html','post_save_redirect' :
> '/pessoa/listar'}),
>
> *forms.py*
> <form action="/pessoa/editar/{{pessoa.id}}">
>        {% csrf_token %}
>        <input type="submit" value="Editar"/>
> </form>
>
> Isso eu fiz seguindo o tutorial do site do Django, mas ele exibe o form
> genérico. No meu caso, ele exibe os campos de contato e de endereco como
> dois combobox. Queria usar o form da mesma forma usado no cadastro.
> O que devo alterar no meu código? Valeu.
>
> Em 24 de maio de 2011 08:01, Thiago Paulino <thiagopauli...@gmail.com>escreveu:
>
> > Opa, td blz?
> > Postei o código Django aqui:http://pastebin.com/DbQUZtSYe o formulário
> > HTML aqui:http://pastebin.com/wL7hwETV
> >  <http://pastebin.com/wL7hwETV>Eu comentei o código pra ficar melhor de
> > entender.
>
> > Boa sorte!
>
> > Em 24 de maio de 2011 00:42, Fabricio Mattos <fabrim...@gmail.com>escreveu:
>
> > Ola Thiago,
>
> >> teria como vc postar como ficou o codigo.
>
> >> Estou tentando fazer isso aqui e estava acompanhando essa thread tentando
> >> fazer o que o pessoal escreveu, mas ainda não consegui salvar no banco .
>
> >> Att
>
> >> Fabricio
>
> >> Em 23 de maio de 2011 22:46, Thiago Paulino <thiagopauli...@gmail.com>escreveu:
>
> >> Acabei de conseguir. o/
> >>> Mas confesso que não foi muito trivial. Achei que o django facilitaria
> >>> pra mim. hehe
> >>> É preciso salvar os objetos "de baixo pra cima", digo, primeiro os que
> >>> não tem foreign key, depois os que tem, enfim...
> >>> O importante é que consegui salvar o danado do objeto.
> >>> Obrigado pela ajuda de vocês.
>
> >>> Em 23 de maio de 2011 21:23, Rodrigo Chacon <rocha...@gmail.com>escreveu:
>
> >>> Para pegar todas a variáveis locais da sua view para passar como
> >>>> contexto, use: locals(). Mas quase sempre você vai passar variáveis extras,
> >>>> desnecessárias para seu template, mantenha-se especificando cada uma.
>
> >>>> Para a dúvida dos forms, tem bastante coisa aqui:
> >>>>http://lmgtfy.com/?q=django+form+two+models
>
> >>>> -- Rodrigo Chacon
>
> >>>> Em 23 de maio de 2011 20:36, Thiago Paulino <thiagopauli...@gmail.com>escreveu:
>
> >>>> E outra coisa, ao invés de eu especificar cada campo, não tem como eu
> >>>>> dizer "pegue todos os campos"?
> >>>>> Já to me descabelando por causa disso. hehe
>
> >>>>> Em 23 de maio de 2011 19:34, Thiago Paulino <thiagopauli...@gmail.com>escreveu:
>
> >>>>> Ainda não consegui fazer o cadastro. :/
> >>>>>> Como disse, eu tenho uma classe Pessoa que tem uma foreign key para
> >>>>>> Endereco e outra para Contato.
>
> >>>>>> Meu código ficou da seguinte forma:
> >>>>>> *forms.py*
> >>>>>> class CadastroPessoaForm(forms.Form):
> >>>>>>     pessoa_nome = forms.CharField()
> >>>>>>     contato_email = forms.CharField()
> >>>>>>     endereco_cep = forms.CharField()
>
> >>>>>>     def save(self):
> >>>>>>         contato =
> >>>>>> Contato.objects.create(email=self.cleaned_data['contato_email'])
> >>>>>>         endereco =
> >>>>>> Endereco.objects.create(cep=self.cleaned_data['endereco_cep'])
> >>>>>>         pessoa = Pessoa.objects.create(contato=contato,
> >>>>>> endereco=endereco, nome=self.cleaned_data['pessoa_nome'])
>
> >>>>>> *urls.py*
>
> >>>>>> url(r'^pessoa/cadastrar$','DjangoProject1.public.views.cadastro_pessoa'),
>
> >>>>>> *views.py*
> >>>>>> def cadastro_pessoa(request):
> >>>>>>     campos = CadastroPessoaForm(request.POST)
> >>>>>>     return render_to_response('generic_form.html',{'form':campos},
> >>>>>> context_instance=RequestContext(request))
>
> >>>>>> Quando eu entro pela url pessoa/cadastrar ele até exibe os campos
> >>>>>> pessoa_nome, contato_email e endereco_cep, que eu coloquei no
> >>>>>> CadastroPessoaForm, mas quando clico no botão cadastrar nada acontece.
> >>>>>> Acredito que eu não esteja fazendo a chamada para o método save(), como faço
> >>>>>> isso?
> >>>>>> Alguém teria aí um exemplo completo já pronto de uma situação parecida
> >>>>>> com a minha? Iria ser de grande ajuda.
>
> >>>>>> Em 23 de maio de 2011 11:08, Ernesto Guevara <eguevara2...@gmail.com>escreveu:
>
> >>>>>> Lembrando que para usar inline, a classe que será instanciada no form
> >>>>>>> inline e que será injetado no form principal precisa estar anotada com
> >>>>>>> ForeignKey. senão vai dar erro.
> >>>>>>> Abraço!
>
> >>>>>>> Em 23 de maio de 2011 08:46, Guilherme Kuhn <g.ku...@gmail.com>escreveu:
>
> >>>>>>> Gilson, creio que seria um inline_formset [1] o que você busca. É bem
> >>>>>>>> simples de fazer e você pode customizar totalmente os forms de cada model. É
> >>>>>>>> desta forma que o admin faz os inlines, porém pode fazer fora do admin
> >>>>>>>> tranquilamente.
>
> >>>>>>>> [1] -
> >>>>>>>>http://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#inline-...
>
> >>>>>>>> Em 23 de maio de 2011 02:57, Rodrigo Chacon <rocha...@gmail.com>escreveu:
>
> >>>>>>>> Thiago, é boa prática deixar seus forms em um arquivo forms.py
> >>>>>>>>> dentro do seu app.
>
> >>>>>>>>> -- Rodrigo Chacon
>
> >>>>>>>>> Em 21 de maio de 2011 18:17, danilo silva dos santo <
> >>>>>>>>> danilo...@gmail.com> escreveu:
>
> >>>>>>>>>  formWirzard ?
>
> >>>>>>>>>> Em 21 de maio de 2011 11:14, Thiago Paulino <
> >>>>>>>>>> thiagopauli...@gmail.com> escreveu:
>
> >>>>>>>>>> Rodrigo, eu teria que declarar essa classe CadastroForm no
> >>>>>>>>>>> models.py também? Se sim, não teria como deixar separado pra organizar
> >>>>>>>>>>> melhor?
>
> >>>>>>>>>>> Em 21 de maio de 2011 00:04, Rodrigo Chacon <rocha...@gmail.com>escreveu:
>
> >>>>>>>>>>> Não seria mais fácil criar um form simples que receba somentes os
> >>>>>>>>>>>> campos necessários e criar neste form um método save que faça o trabalho de
> >>>>>>>>>>>> salvar e linkar?
>
> >>>>>>>>>>>> Vou tentar usar o caso do Gilson para tentar exemplificar, dado
> >>>>>>>>>>>> que ele não usa o admin e *este método não se aplica ao admin*:
>
> >>>>>>>>>>>> Models: User, Fornecedor
>
> >>>>>>>>>>>> Form:
> >>>>>>>>>>>> class CadastroForm(forms.Form):
> >>>>>>>>>>>>   usuario = forms.CharField()
> >>>>>>>>>>>>   nome_fornecedor = forms.CharField()
>
> >>>>>>>>>>>>   def save(self):
> >>>>>>>>>>>>     user =
> >>>>>>>>>>>> User.objects.create(username=self.cleaned_data['usuario'])
> >>>>>>>>>>>>     fornecedor = Fornecedor.objects.create(user=user,
> >>>>>>>>>>>> nome=self.cleaned_data['nome_fornecedor'])
>
> >>>>>>>>>>>> View:
> >>>>>>>>>>>> def view(request):
> >>>>>>>>>>>>    form = CadastroForm(request.POST)
> >>>>>>>>>>>>    # etc...
>
> >>>>>>>>>>>> O Django não disponibiliza somente os ModelForm's, então não
> >>>>>>>>>>>> fiquem presos a eles. =D
> >>>>>>>>>>>> Neste caso, você consegue cadastrar ambos os modelos em um único
> >>>>>>>>>>>> form, tratando validação erros e tudo o mais que precisar.
>
> >>>>>>>>>>>> -- Rodrigo Chacon
>
> >>>>>>>>>>>> Em 19 de maio de 2011 20:01, Ernesto Guevara <
> >>>>>>>>>>>> eguevara2...@gmail.com> escreveu:
>
> >>>>>>>>>>>> Olá!
> >>>>>>>>>>>>> Não ficou claro pra mim essa parte de passar campos de A para
> >>>>>>>>>>>>> B.
> >>>>>>>>>>>>> Se o que vc quer é embutir o form de A em B, na existência de
> >>>>>>>>>>>>> relacionamentos, o Django cria um select (combobox) do modelo relacionado
> >>>>>>>>>>>>> automaticamente e não um form. Eu tb já tive essa necessidade mas não
> >>>>>>>>>>>>> encontrei a resposta por enquanto.
> >>>>>>>>>>>>> Me disseram que deveria alterar o widget, mas não deu certo,
> >>>>>>>>>>>>> então eu excluo o relacionado no forms.py e instancio dois forms na
> >>>>>>>>>>>>> views.py, para ter assim um form abaixo do outro.
> >>>>>>>>>>>>> Abraço!
>
> >>>>>>>>>>>>> Em 19 de maio de 2011 17:47, contatogilson...@gmail.com <
> >>>>>>>>>>>>> contatogilson...@gmail.com> escreveu:
>
> >>>>>>>>>>>>> Olá pessoal,
>
> >>>>>>>>>>>>>> Eu estou com uma dúvida aqui. Tem como eu criar um formulário
> >>>>>>>>>>>>>> a partir do ModelForm com dois modelos de dados? Por exemplo:
>
> >>>>>>>>>>>>>> - Modelo B tem um campo que é uma chave estrangeira do Modelo
> >>>>>>>>>>>>>> A;
>
> >>>>>>>>>>>>>> Com isso eu queria passar todos os campos do Modelo A para
> >>>>>>>>>>>>>> preencher mais os do Modelo B.
>
> >>>>>>>>>>>>>> Tem como fazer isso?
> >>>>>>>>>>>>>> _____________________________________________
> >>>>>>>>>>>>>> *Gilson Filho*
> >>>>>>>>>>>>>> *Web Developer
> >>>>>>>>>>>>>>http://gilsondev.com*
>
> >>>>>>>>>>>>>>  --
> >>>>>>>>>>>>>> Django Brasil em Google Groups <
> >>>>>>>>>>>>>>http://groups.google.com.br/group/django-brasil>
> >>>>>>>>>>>>>> Associe-se à Python Brasil e suporte nossa comunidade! <
> >>>>>>>>>>>>>>http://associacao.python.org.br/>
>
> >>>>>>>>>>>>>  --
> >>>>>>>>>>>>> Django Brasil em Google Groups <
> >>>>>>>>>>>>>http://groups.google.com.br/group/django-brasil>
> >>>>>>>>>>>>> Associe-se à Python Brasil e suporte nossa comunidade! <
> >>>>>>>>>>>>>http://associacao.python.org.br/>
>
> >>>>>>>>>>>>  --
> >>>>>>>>>>>> Django Brasil em Google Groups <
> >>>>>>>>>>>>http://groups.google.com.br/group/django-brasil>
> >>>>>>>>>>>> Associe-se à Python Brasil e suporte nossa comunidade! <
> >>>>>>>>>>>>http://associacao.python.org.br/>
>
> >>>>>>>>>>> --
> >>>>>>>>>>> *Thiago P.
> >>>>>>>>>>> Graduando em Sistemas p/ Internet - IFPB
> >>>>>>>>>>> Pós-graduando em Desenv. p/ Dispositivos móveis - FatecJP
>
> ...
>
> read more »

Guilherme Kuhn

unread,
May 25, 2011, 1:44:22 PM5/25/11
to django...@googlegroups.com
Aniely

Estou usando o inlineformset_factory e funciona corretamente, vou dar um exemplo de código [1] para vc ver.
Preste atenção a esta linha: 
59:  ip = ItensPregaoFormset(request.POST, instance=pregao)
 
é muito importante vc passar a instance quando for salvar caso contrário ocorrerá essa exception de que o campo não pode ser null.


Espero ter ajudado.

Abraço!

Aniely Martins

unread,
May 25, 2011, 4:07:34 PM5/25/11
to Django Brasil
No meu estava falando o instance, mas agora ele exibi normalmente o
inline, permite da o POST mas os campos do inline ficam vazios, não
armazenada nada. =/
meu codigo segue abaixo:
http://dpaste.com/hold/546500/

On May 25, 2:44 pm, Guilherme Kuhn <g.ku...@gmail.com> wrote:
> Aniely
>
> Estou usando o inlineformset_factory e funciona corretamente, vou dar um
> exemplo de código [1] para vc ver.
> Preste atenção a esta linha:
>
>
>
> > 59:  ip = ItensPregaoFormset(request.POST, instance=pregao)
>
> é muito importante vc passar a instance quando for salvar caso contrário
> ocorrerá essa exception de que o campo não pode ser null.
>
> [1] -http://dpaste.com/hold/546468/
>
> Espero ter ajudado.
>
> Abraço!
> > > > Postei o código Django aqui:http://pastebin.com/DbQUZtSYeo formulário
> ...
>
> read more »

Aniely Martins

unread,
May 25, 2011, 4:21:25 PM5/25/11
to Django Brasil
Minha view ta certinha mesmo, tava dando erro por causa do meu model..
Obrigada pela ajuda Guilherme!
> ...
>
> read more »

Alex Figueira

unread,
May 25, 2011, 5:09:46 PM5/25/11
to django...@googlegroups.com
Só para registrar, fiz da forma como o Thiago fez e funcionou perfeitamente e atribuiu a chave corretamente.

Obrigado pelas dicas.

> ...
>
> read more »

--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>



--
Alex Figueira
Analista de Desenvolvimento de Sistemas
TV Brasil e Rádios MEC
fone: 55 21 2117-6797 / 2117-6200 (central)
Rua da Relação 18 - 7° Andar Centro
http://www.tvbrasil.org.br
http://www.radiomec.com.br

Thiago Paulino

unread,
May 25, 2011, 6:36:05 PM5/25/11
to django...@googlegroups.com
Alex e Aniely, vocês conseguiram um jeito de editar também?
Thiago P.
Graduando em Sistemas p/ Internet - IFPB
Pós-graduando em Desenv. p/ Dispositivos móveis - FatecJP

Daniel Santos Dantas

unread,
May 26, 2011, 1:19:51 PM5/26/11
to Django Brasil
ei cara,consegui editar.
Faz o mesmo inlineformset_factory e instacie o que seria não somente
a chave estrangeira mas toda a tabela.
Embaixo segue um exemplo vindo da própria documentação do django.
Espero que ajude.

from django.forms.models import inlineformset_factory
BookFormSet = inlineformset_factory(Author, Book)
author = Author.objects.get(name=u’Mike Royko’)
formset = BookFormSet(instance=author)


On 25 maio, 19:36, Thiago Paulino <thiagopauli...@gmail.com> wrote:
> Alex e Aniely, vocês conseguiram um jeito de editar também?
>
> Em 25 de maio de 2011 18:09, Alex Figueira <alex.mar...@gmail.com> escreveu:
>
> > Só para registrar, fiz da forma como o Thiago fez e funcionou perfeitamente
> > e atribuiu a chave corretamente.
>
> > Obrigado pelas dicas.
>
> ...
>
> mais »

Thiago Paulino

unread,
May 26, 2011, 4:38:14 PM5/26/11
to django...@googlegroups.com
Valeu Daniel, mas eu já tinha conseguido aqui de outro jeito.
Usei o mesmo código que eu já postei antes, apenas fiz alterações no views.py.
Ficou assim:

def cadastro_pessoa(request, object_id=None):
    if not object_id == None:
        pessoa = Pessoa.objects.get(pk=object_id)
        contato = Contato.objects.get(pk=pessoa.contato.id)
        endereco = Endereco.objects.get(pk=pessoa.endereco.id)
    else:
        pessoa = Pessoa()
        contato = Contato()
        endereco = Endereco()

Ou seja, se no object_id vier alguma coisa então eu considero que é uma edição, recupero os objetos com aquele id e preencho o form. O resto é igual.


--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>
Reply all
Reply to author
Forward
0 new messages