Django formset equivalent in angular.js

Django possède des formes, où plusieurs formes peuvent être utilisées dans une grande forme. Disons qu'on peut ajouter dans une bibliothèque plusieurs livres de formes de formulaires (fournissant l'auteur et le titre) à l'aide de répétitions du même libellé.

Comment obtenir la même fonctionnalité avec Angular.js et Django Rest Framework? Je suis nouveau dans Angular.js et Django Rest Framework et j'ai besoin de conseils pour pouvoir ajouter dynamiquement plus de formes (p. Ex. Pour un livre) pour un modèle donné dans une grande forme (par exemple, ma bibliothèque) et les enregistrer dans Django Backend .

Vous pouvez l'atteindre en 2 étapes:

Sur Frontend

Créez un <form> sur votre page qui va structurer les données saisies par l'utilisateur comme vous avez besoin. À l'intérieur de cet élément <form> , vous devez utiliser le ngForm pour la ngForm de plusieurs formulaires pour se comporter correctement ( voici une bonne explication de la façon dont ngForm fonctionne). Un extrait de code hypothétique ressemblerait à:

 <form name="libraryForm"> <div ng-repeat="book in vm.newBooksToAdd"> <!-- ngForm directive allows to create forms within the parent form --> <ng-form name="bookForm"> <div> <label>Book title</label> <input ng-model="book.title" type="text" name="title" required> </div> <div> <label>Author</label> <input ng-model="book.author" type="text" name="author" required> </div> </ng-form> </div> </form> 

Dans votre contrôleur, vous pouvez initialiser la liste des livres à ajouter en tant que vm.newBooksToAdd = []; Et chaque fois que vous souhaitez ajouter un nouveau formulaire à votre liste de formulaires pour les nouveaux livres, vm.newBooksToAdd.push({}) un objet vide. Ainsi, vous allez envoyer au backend un ensemble d'objets représentant les livres que vous souhaitez créer.

On Backend

Maintenant, vous devez remplacer la méthode .create() de votre vue pour permettre la création de plusieurs instances à la fois, car, par défaut, elle s'attend à un seul objet. Votre vue pourrait ressembler à ceci:

 class LibraryViewSet(views.ModelViewSet): ... def create(self, request): serializer = self.get_serializer(data=request.data, many=True) # notice the `many` keywork argument here serializer.is_valid(raise_exception=True) self.perform_create(serializer) return Response(serializer.data, status=status.HTTP_201_CREATED) 

Remarque: Si vous souhaitez autoriser à la fois une création et une création d'une seule instance en vrac, vous devrez ajuster votre méthode .create() pour vérifier le type de données de request.data .

Note 2: Il existe une django-rest-framework-bulk qui réalise ce que vous voulez sur le backend, mais je n'ai pas essayé, donc je ne peux rien dire de mauvais ou de bon.

Bonne chance!