Est-il possible d'avoir plusieurs modèles inclus dans un seul ModelForm
dans django? J'essaye de créer un formulaire de modification de profil. Je dois donc inclure certains champs du modèle User et du modèle UserProfile. Actuellement, j'utilise 2 formulaires comme celui-ci
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-t-il un moyen de les regrouper en un seul formulaire ou dois-je simplement créer un formulaire et gérer le chargement et l'enregistrement de la base de données?
python
django
django-forms
Jason Webb
la source
la source
Réponses:
Vous pouvez simplement afficher les deux formulaires dans le modèle à l'intérieur d'un
<form>
élément html. Traitez ensuite simplement les formulaires séparément dans la vue. Vous pourrez toujours utiliserform.save()
et ne pas avoir à traiter vous-même le chargement et l'enregistrement de la base de données.Dans ce cas, vous ne devriez pas en avoir besoin, mais si vous allez utiliser des formulaires avec les mêmes noms de champ, regardez dans le
prefix
kwarg pour les formulaires django. (J'ai répondu à une question à ce sujet ici ).la source
<form>
élément?FormView
seul lui estform_class
assigné.TemplateView
- classez simplement et implémentez la même logique que FormView, mais avec plusieurs formulaires.Vous pouvez essayer d'utiliser ces morceaux de code:
Exemple d'utilisation:
la source
admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
UpdateView
?erikbwork et moi-même avons eu le problème que l'on ne peut inclure qu'un seul modèle dans une vue générique basée sur les classes. J'ai trouvé une manière similaire de l'aborder comme Miao, mais plus modulaire.
J'ai écrit un Mixin pour que vous puissiez utiliser toutes les vues génériques basées sur les classes. Définissez le modèle, les champs et maintenant aussi child_model et child_field - et vous pouvez ensuite envelopper les champs des deux modèles dans une balise comme Zach le décrit.
Exemple d'utilisation:
Ou avec ModelFormClass:
Terminé. J'espère que cela aide quelqu'un.
la source
save_child_form.course_key = self.object
, qu'est-ce que c'est.course_key
?return self.child_form_class(**self.get_form_kwargs())
mais il obtient la mauvaise instance de modèlekwargs['instance']
, par exemple, instance est le modèle principal et non le modèle enfant. Pour résoudre ce problème, vous devez d'abord enregistrer les kwargs dans une variable,kwargs = self.get_form_kwargs()
puis mettrekwargs['initial']
à jour avec l'instance de modèle correcte avant d'appelerreturn self.child_form_class(**kwargs)
. Dans mon cas, c'étaitkwargs['instance'] = kwargs['instance'].profile
si cela avait du sens.model_forms
?Vous devriez probablement jeter un œil aux ensembles de formulaires en ligne . Les ensembles de formulaires en ligne sont utilisés lorsque vos modèles sont liés par une clé étrangère.
la source
Vous pouvez vérifier ma réponse ici pour un problème similaire.
Il explique comment combiner l'enregistrement et le profil utilisateur dans un seul formulaire, mais il peut être généralisé à n'importe quelle combinaison ModelForm.
la source
J'ai utilisé MultiForm et MultiModelForm de django betterforms dans mon projet. Le code peut cependant être amélioré. Par exemple, il dépend de django.six, qui n'est pas pris en charge par 3. +, mais tous peuvent être facilement corrigés
Cette question est apparue plusieurs fois dans StackOverflow, donc je pense qu'il est temps de trouver un moyen standardisé de faire face à cela.
la source