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:
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.
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!