Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django - Combiner un Formset avec un Form sur la même page

0 votes

J'ai 2 models :

class Choice(models.Model):
    name = models.CharField( max_length=255)

class Question(models.Model):
     name = models.CharField( max_length=255)
     choices = models.ManyToManyField('Choice')

J'ai 2 forms (un form permettant l'ajout d'une question et un formset permettant la création de plusieurs choix) :

class QuestionForm(forms.Form):
    class Meta:
        fields = ['name']

class QuestionChoiceForm(forms.Form):
    class Meta:
        fields = ['name']

formset = formset_factory(form=QuestionChoiceForm, extra=2)

Ce que j'aimerais : donner la possibilité à l'utilisateur de créer une question avec des choix sur la même page. J'aimerais donc pouvoir cumuler 2 formulaires sur la même page avec une validation des 2 formulaires d'un coup (tout en donnant la possibilité à l'utilisateur d'ajouter un ou n choix).

J'ai déjà essayé la librairie django better forms (librairie qui permet de cumuler plusieurs formulaires sur une même page) mais elle ne fonctionne pas pour un formset et un form en même temps.

demandé 10-Jun-2016 par ronan (184 points)

2 Réponses

+1 vote
 
Meilleure réponse

Je fais ça tous.les jours... en CBV :

  • Faire ton formset à base de inline_formsetfactory (le définir dans forms.py)
  • Ajouter le formset dans la vue dans la méthode get_context_data()
  • ... remplir le formulaire...
  • Récupérer l'ensemble des formulaires dans le post(self, request) dans le code de la vue

Tout est dans la sauvegarde du formulaire:
* sauvegarder le contenu du formulaire avec instance = form.save()
* sauvegarder le contenu du formset en ajoutant l'instance comme 1er paramètre du formset
J'espère que j'ai été clair, je peux te poster du code demain (je suis chez moi)

répondu 12-Jun-2016 par frague (484 points)
sélectionné 13-Jun-2016 par ronan

Oui je veux bien du code merci :)

Concernant le inline_formsetfactory, je me trompe peut être mais il ne permet que d'ajouter des choix à une question sur la même page, ce qui implique que les choix ont déjà été créés en bdd. Moi ce que je souhaite c'est pouvoir créer sur la même page une question et des choix, et que ces choix là soient bien évidemment affectés à la question par la suite.

https://gist.github.com/frague59/fe729691bfe41ab26eef1d6de859256f

Tu dois updater le contexte de la form view avec le contenu du contexte retourné par le get_context_data() de la classe...

https://gist.github.com/frague59/fe729691bfe41ab26eef1d6de859256f

https://gist.github.com/frague59/0c19fb6d53453b30075ff7dc5111f03c

Tu dois updater le contexte de la form view avec le contenu du contexte retourné par le get_context_data() de la classe...

(il manquait un bout)

Yes tout est dans le sauvegarde.

Merci !

Oui je veux bien du code :)

Concernant le inline_formsetfactory, je me trompe peut être mais il ne permet que d'ajouter des choix à une question sur la même page, ce qui implique que les choix ont déjà été créés en bdd. Moi ce que je souhaite c'est pouvoir créer sur la même page une question et des choix, et que ces choix là soient bien évidemment affectés à la question par la suite.

+1 vote

Voici un exemple d'utilisation:

Gist

répondu 9-Jul-2016 par Echel8n (246 points)
...