Plusieurs Modèles dans un seul django ModelForm?
Est-il possible d'avoir plusieurs modèles inclus dans un seul ModelForm
dans django? Je suis en train de créer un formulaire de modification de profil. J'ai donc besoin d'inclure certains champs de l'Utilisateur modèle et la UserProfile modèle. Actuellement, je suis à l'aide de 2 formes comme ce
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")
Est-il un moyen de consolider ces dans une forme ou dois-je juste besoin de créer un formulaire et de gérer la db de chargement et de sauver de moi-même?
- Double Possible de Django: plusieurs modèles dans un modèle à l'aide de formulaires
Vous devez vous connecter pour publier un commentaire.
Vous pouvez montrer les deux formes dans le modèle à l'intérieur d'un
<form>
de l'élément html. Puis il suffit de traiter les formes séparément dans la vue. Vous serez toujours en mesure d'utiliserform.save()
et ne pas avoir à traiter db chargement et l'enregistrement vous-même.Dans ce cas, vous ne devriez pas en avoir besoin, mais si vous allez être en utilisant des formes avec les mêmes noms de champs, regarder dans la
prefix
kwarg pour django formes. (J'ai répondu à une question à ce sujet ici).<form>
élément?FormView
n'a qu'un seulform_class
lui est assigné.TemplateView
et de mettre en œuvre la même logique que l'FormView, mais avec de multiples formes.Vous pouvez essayer d'utiliser ce morceaux de code:
Exemple D'Utilisation:
admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
erikbwork et m'avaient tous les deux le problème que l'on ne peut contenir qu'un modèle dans une Classe générique Basée Vue. J'ai trouvé une manière similaire à la façon de l'aborder comme Miao, mais plus modulaire.
J'ai écrit un Mixin de sorte que vous pouvez utiliser tous les génériques de la Classe de Base point de Vue. Définir un modèle, les champs et maintenant aussi child_model et child_field - et puis vous pouvez envelopper les champs des deux modèles dans une balise comme Zach décrit.
Exemple D'Utilisation:
Ou avec ModelFormClass:
Fait. Espérons que l'aide à quelqu'un.
save_child_form.course_key = self.object
, qu'est-ce que.course_key
?return self.child_form_class(**self.get_form_kwargs())
mais il reçoit la mauvaise instance du modèle danskwargs['instance']
, par exemple, l'instance est le modèle principal et non pas le modèle de l'enfant. Pour résoudre vous avez besoin pour économiser de l'kwargs dans une variable de premièrekwargs = self.get_form_kwargs()
puis mise à jourkwargs['initial']
avec le bon modèle de l'instance avant d'appelerreturn self.child_form_class(**kwargs)
. Dans mon cas, c'étaitkwargs['instance'] = kwargs['instance'].profile
si cela fait sens.Vous devriez probablement prendre un coup d'oeil à Inline formsets. Inline formsets sont utilisés lors de vos modèles sont liées par une clé étrangère.
Vous pouvez vérifier ma réponse ici pour un problème similaire.
Il parle de la façon de combiner l'enregistrement et le profil de l'utilisateur dans un formulaire, mais elle peut être généralisée à tout ModelForm combinaison.