Supprimer plusieurs objets dans django

108

Je dois sélectionner plusieurs objets à supprimer de ma base de données dans django en utilisant une page Web. Il n'y a pas de catégorie à sélectionner, donc je ne peux pas les supprimer de toutes comme ça. Dois-je implémenter mon propre formulaire de suppression et le traiter dans django ou est-ce que django a déjà un moyen de le faire? Comme il est implémenté dans l'interface d'administration.

doyen
la source

Réponses:

203

Vous pouvez supprimer n'importe quel QuerySet de votre choix. Par exemple, pour supprimer tous les articles de blog avec un modèle d'article

Post.objects.all().delete()

et pour supprimer tout article avec une date de publication future

Post.objects.filter(pub_date__gt=datetime.now()).delete()

Cependant, vous devez trouver un moyen d'affiner votre QuerySet. Si vous voulez simplement qu'une vue supprime un objet particulier, regardez dans la vue générique de suppression .

ÉDITER:

Désolé pour le malentendu. Je pense que la réponse se situe quelque part entre les deux. Pour implémenter les vôtres, combinez les vuesModelForm s et génériques . Sinon, examinez les applications tierces qui offrent des fonctionnalités similaires. Dans une question connexe , la recommandation était django-filter .

Matt Luongo
la source
1
Non, vous avez mal compris la question. Je comprends que je peux tout supprimer. Mais je dois sélectionner les objets à supprimer avec un formulaire sur une page Web. Et puis traitez les données renvoyées par le formulaire dans mon views.py. Ensuite, parcourez ce qui est retourné dans le formulaire de suppression au fur et à mesure de sa boucle dans les données. Mais je voulais savoir quelles sont les meilleures pratiques pour implémenter cela dans django.
Dean
Ah, mon erreur! J'utiliserais soit une application tierce, soit des vues génériques avec ModelForms.
Matt Luongo le
7
@Dean, jetez un œil à cette vue de suppression. Ou vous pouvez simplement écrire votre propre vue ... Je veux dire qu'en fin de compte, vous recevez probablement une liste de PK et appelez delete sur votre modèle ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()et je suis sûr que vous voulez quelque chose pour vous assurer qu'une personne aléatoire ne peut pas tout supprimer objets dans votre base de données en devinant PK.
Yuji 'Tomita' Tomita le
1
@Dean, il est difficile de répondre à votre question sans en comprendre davantage. Il vous suffit de créer un formulaire qui permette à un utilisateur de sélectionner les bons critères de suppression (quel qu'il soit - peut-être même une zone de saisie où l'on tape un numéro d'identification ... mais probablement plus complexe), de créer une vue qui répond à cela form, effectue peut-être la validation (autorisations), puis exécute finalement cette filter(foo).delete()méthode.
Yuji 'Tomita' Tomita le
1
L'une des raisons pour lesquelles cela ne vient pas avec le framework est la question de l'autorisation pour les modifications / suppressions et autres complexités mentionnées par @YujiTomita. Si vous avez vraiment besoin d'un filtrage complexe, consultez le filtrage django et ajoutez un bouton de suppression qui appelle QuerySet.delete () si l'utilisateur est autorisé.
Matt Luongo le