É possível ter vários modelos incluídos em um único ModelForm
no django? Estou tentando criar um formulário de edição de perfil. Portanto, preciso incluir alguns campos do modelo de usuário e do modelo de UserProfile. Atualmente estou usando 2 formulários como este
class UserEditForm(ModelForm):
class Meta:
model = User
fields = ("first_name", "last_name")
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ("middle_name", "home_phone", "work_phone", "cell_phone")
Existe uma maneira de consolidar isso em um formulário ou eu só preciso criar um formulário e lidar com o carregamento do banco de dados e salvando-me?
python
django
django-forms
Jason Webb
fonte
fonte
Respostas:
Você pode apenas mostrar os dois formulários no modelo dentro de um
<form>
elemento html. Em seguida, basta processar os formulários separadamente na visualização. Você ainda poderá usarform.save()
e não terá que processar o carregamento e salvamento do banco de dados.Nesse caso, você não deve precisar, mas se for usar formulários com os mesmos nomes de campo, procure no
prefix
kwarg por formulários django. (Eu respondi uma pergunta sobre isso aqui ).fonte
<form>
elemento?FormView
tem apenas umform_class
atribuído a ele.TemplateView
e implemente a mesma lógica do FormView, mas com vários formulários.Você pode tentar usar estes pedaços de código:
Exemplo de uso:
fonte
admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
UpdateView
?erikbwork e eu tínhamos o problema de que só se pode incluir um modelo em uma Visão baseada em classe genérica. Eu encontrei uma maneira semelhante de abordar como Miao, mas mais modular.
Eu escrevi um Mixin para que você possa usar todas as visualizações genéricas baseadas em classes. Defina modelo, campos e agora também child_model e child_field - e então você pode envolver os campos de ambos os modelos em uma tag como Zach descreve.
Exemplo de uso:
Ou com ModelFormClass:
Feito. Espero que ajude alguém.
fonte
save_child_form.course_key = self.object
, o que é.course_key
?return self.child_form_class(**self.get_form_kwargs())
mas obtém a instância de modelo erradakwargs['instance']
, por exemplo, instância é o modelo principal e não o modelo filho. Para corrigir, você precisa primeiro salvar kwargs em uma variável ekwargs = self.get_form_kwargs()
depois atualizarkwargs['initial']
com a instância de modelo correta antes de chamarreturn self.child_form_class(**kwargs)
. No meu caso, erakwargs['instance'] = kwargs['instance'].profile
se isso fizesse sentido.model_forms
?Você provavelmente deve dar uma olhada em conjuntos de formulários embutidos . Formulários embutidos são usados quando seus modelos são relacionados por uma chave estrangeira.
fonte
Você pode verificar minha resposta aqui para um problema semelhante.
Ele fala sobre como combinar registro e perfil de usuário em um único formulário, mas pode ser generalizado para qualquer combinação de ModelForm.
fonte
Eu usei Django betterforms 's multiforme e MultiModelForm no meu projeto. O código pode ser melhorado, no entanto. Por exemplo, ele depende de django.six, que não é compatível com o 3. +, mas tudo isso pode ser facilmente corrigido
Esta questão apareceu várias vezes no StackOverflow, então acho que é hora de encontrar uma maneira padronizada de lidar com isso.
fonte