¿Es posible tener varios modelos incluidos en un solo ModelForm
en django? Estoy intentando crear un formulario de edición de perfil. Así que necesito incluir algunos campos del modelo de usuario y del modelo de perfil de usuario . Actualmente estoy usando 2 formularios 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")
¿Hay alguna forma de consolidarlos en un formulario o solo necesito crear un formulario y manejar la carga de la base de datos y guardarme?
python
django
django-forms
Jason Webb
fuente
fuente
Respuestas:
Puede mostrar ambos formularios en la plantilla dentro de un
<form>
elemento html. Luego, procese los formularios por separado en la vista. Aún podrá usarform.save()
y no tendrá que procesar la carga de la base de datos y guardarlo.En este caso, no debería necesitarlo, pero si va a utilizar formularios con los mismos nombres de campo, busque en el
prefix
kwarg los formularios de django. (Respondí una pregunta al respecto aquí ).fuente
<form>
elemento?FormView
solo tiene unoform_class
asignado.TemplateView
realice una subclase e implemente la misma lógica que FormView, pero con múltiples formularios.Puede intentar utilizar estos fragmentos de código:
Ejemplo de uso:
fuente
admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
UpdateView
?Erikbwork y yo tuvimos el problema de que solo se puede incluir un modelo en una vista basada en clases genérica. Encontré una forma similar de abordarlo como Miao, pero más modular.
Escribí un Mixin para que puedas usar todas las vistas genéricas basadas en clases. Defina modelo, campos y ahora también child_model y child_field, y luego puede ajustar los campos de ambos modelos en una etiqueta como describe Zach.
Ejemplo de uso:
O con ModelFormClass:
Hecho. Espero que ayude a alguien.
fuente
save_child_form.course_key = self.object
, ¿qué es.course_key
?return self.child_form_class(**self.get_form_kwargs())
pero obtiene la instancia de modelo incorrectakwargs['instance']
, por ejemplo, la instancia es el modelo principal y no el modelo hijo. Para solucionarlo, primero debe guardar kwargs en una variable ykwargs = self.get_form_kwargs()
luego actualizarkwargs['initial']
con la instancia de modelo correcta antes de llamarreturn self.child_form_class(**kwargs)
. En mi caso eso fuekwargs['instance'] = kwargs['instance'].profile
si esto tiene sentido.model_forms
?Probablemente debería echar un vistazo a los conjuntos de formularios en línea . Los conjuntos de formularios en línea se utilizan cuando sus modelos están relacionados por una clave externa.
fuente
Puede consultar mi respuesta aquí para un problema similar.
Habla sobre cómo combinar el registro y el perfil de usuario en un formulario, pero se puede generalizar a cualquier combinación de ModelForm.
fuente
Solía django betterforms 's multiforme y MultiModelForm en mi proyecto. Sin embargo, el código se puede mejorar. Por ejemplo, depende de django.six, que no es compatible con 3. +, pero todos estos se pueden solucionar fácilmente
Esta pregunta ha aparecido varias veces en StackOverflow, así que creo que es hora de encontrar una forma estandarizada de lidiar con esto.
fuente