188

I need to select several objects to be deleted from my database in django using a webpage. There is no category to select from so I can't delete from all of them like that. Do I have to implement my own delete form and process it in django or does django have a way to already do this? As its implemented in the admin interface.

Dean
  • 8,668
  • 17
  • 57
  • 86

1 Answers1

356

You can delete any QuerySet you'd like. For example, to delete all blog posts with some Post model

Post.objects.all().delete()

and to delete any Post with a future publication date

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

You do, however, need to come up with a way to narrow down your QuerySet. If you just want a view to delete a particular object, look into the delete generic view.

EDIT:

Sorry for the misunderstanding. I think the answer is somewhere between. To implement your own, combine ModelForms and generic views. Otherwise, look into 3rd party apps that provide similar functionality. In a related question, the recommendation was django-filter.

Community
  • 1
  • 1
Matt Luongo
  • 14,371
  • 6
  • 53
  • 64
  • 1
    No you've misunderstood the question. I understand I can delete everything. But I need to select the objects to delete with a form on a webpage. And then process the data returned from the form in my views.py. Then loop through whats returned in the form deleting as its looping through the data. But I wanted to know what is best practice for implementing this in django. – Dean Feb 04 '12 at 18:39
  • Ah, my mistake! I would either use a third-party app, or generic views with `ModelForm`s. – Matt Luongo Feb 04 '12 at 18:47
  • 8
    @Dean, take a look at that delete view. Or you can just write your own view... I mean ultimately you are probably receiving a list of PKs and calling delete on your model... `MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()` and I'm sure you want something to make sure a random person can't delete all objects in your DB by guessing PKs. – Yuji 'Tomita' Tomita Feb 04 '12 at 19:22
  • @YujiTomita Could you write more of an answer to your comment as that is exactly the sort of thing which answers my question. – Dean Feb 04 '12 at 19:27
  • 1
    @Dean, it's tough to answer your question without understanding more about it. You just need to build a form that allows a user to select the correct delete criteria (whatever that may be - perhaps even an input box where one types an ID number... but probably more complex), build a view that responds to that form, perhaps performs validation (permissions), and then finally runs that `filter(foo).delete()` method. – Yuji 'Tomita' Tomita Feb 04 '12 at 19:41
  • 1
    One of the reasons this doesn't come with the framework is the question of authorization for edits/deletion and other complexities mentioned by @YujiTomita. If you really need complex filtering, check out django-filtering and add a delete button that calls QuerySet.delete() if the user is authorized. – Matt Luongo Feb 04 '12 at 20:04