Estou construindo um aplicativo de rastreamento de tíquetes de suporte e tenho alguns modelos que gostaria de criar em uma página. Os ingressos pertencem a um cliente por meio de uma ForeignKey. As notas também pertencem aos Tickets por meio de uma ForeignKey. Eu gostaria de ter a opção de selecionar um cliente (que é um projeto totalmente separado) OU criar um novo cliente, então criar um tíquete e finalmente criar uma nota atribuída ao novo tíquete.
Como sou bastante novo no Django, tendo a trabalhar iterativamente, testando novos recursos a cada vez. Eu joguei com ModelForms, mas quero ocultar alguns dos campos e fazer algumas validações complexas. Parece que o nível de controle que estou procurando requer conjuntos de formulários ou fazer tudo à mão, com uma página de modelo entediante e codificada à mão, que estou tentando evitar.
Há algum recurso adorável que estou perdendo? Alguém tem uma boa referência ou exemplo de uso de formsets? Passei um fim de semana inteiro nos documentos da API para eles e ainda estou sem noção. É um problema de design se eu quebrar e codificar tudo manualmente?
fonte
Respostas:
Isso realmente não é muito difícil de implementar com ModelForms . Então, digamos que você tenha os Formulários A, B e C. Você imprime cada um dos formulários e a página e agora precisa lidar com o POST.
Aqui estão os documentos para validação personalizada.
fonte
Eu estava quase na mesma situação um dia atrás, e aqui estão meus 2 centavos:
1) Eu encontrei sem dúvida a demonstração mais curta e concisa de entrada de vários modelos em um único formulário aqui: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
Resumindo: Faça um formulário para cada modelo, envie os dois para o modelo em um só
<form>
, usandoprefix
keyarg e tenha a validação do identificador de visualização. Se houver dependência, apenas certifique-se de salvar o modelo "pai" antes do dependente, e use o ID do pai para a chave estrangeira antes de salvar o modelo "filho". O link contém a demonstração.2) Talvez os formsets possam ser batidos para fazer isso, mas pelo que eu investiguei, os formsets são principalmente para inserir múltiplos do mesmo modelo, que podem ser opcionalmente vinculados a outro modelo / modelos por chaves estrangeiras. No entanto, parece não haver opção padrão para inserir mais de um dado do modelo e não é para isso que o formset parece ser feito.
fonte
Recentemente tive alguns problemas e descobri como fazer isso. Supondo que você tenha três classes, Primária, B, C e que B, C tenham uma chave estrangeira para primária
Este método deve permitir que você faça qualquer validação necessária, bem como gerar todos os três objetos na mesma página. Também usei javascript e campos ocultos para permitir a geração de vários objetos B, C na mesma página.
fonte
O MultiModelForm de
django-betterforms
é um wrapper conveniente para fazer o que é descrito na resposta de Gnudiff . Ele envolveModelForm
s regulares em uma única classe que é transparente (pelo menos para o uso básico) usado como um único formulário. Copiei um exemplo de seus documentos abaixo.fonte
django-betterforms
e sua classe MultiModelForm antes de encontrar sua resposta. A solução deles parece muito boa, mas parece que não é atualizada há algum tempo. Você ainda está usando @jozxyqk? Quaisquer problemas?Atualmente, tenho uma solução alternativa funcional (ela passa nos testes de unidade). É uma boa solução para minha opinião quando você deseja apenas adicionar um número limitado de campos de outros modelos.
Estou faltando alguma coisa aqui?
fonte
"Eu quero ocultar alguns dos campos e fazer algumas validações complexas."
Começo com a interface de administração integrada.
Construa o ModelForm para mostrar os campos desejados.
Estenda o formulário com as regras de validação dentro do formulário. Normalmente, este é um
clean
método.Certifique-se de que esta parte funcione razoavelmente bem.
Depois de fazer isso, você pode sair da interface administrativa integrada.
Então, você pode brincar com vários formulários parcialmente relacionados em uma única página da web. Este é um monte de coisas de modelo para apresentar todos os formulários em uma única página.
Então você tem que escrever a função de visualização para ler e validar as várias coisas do formulário e fazer os vários objetos salvos ().
"É um problema de design se eu quebrar e codificar tudo manualmente?" Não, é apenas muito tempo para não trazer muitos benefícios.
fonte
De acordo com a documentação do Django, os formsets inline são para este propósito: "formsets inline é uma pequena camada de abstração no topo dos formsets do modelo. Isso simplifica o caso de trabalhar com objetos relacionados através de uma chave estrangeira".
Consulte https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets
fonte