Hapus beberapa objek di django

108

Saya perlu memilih beberapa objek untuk dihapus dari database saya di django menggunakan halaman web. Tidak ada kategori untuk dipilih jadi saya tidak bisa menghapus dari semuanya seperti itu. Apakah saya harus mengimplementasikan formulir hapus saya sendiri dan memprosesnya dalam django atau apakah django sudah mempunyai cara untuk melakukan ini? Seperti yang diterapkan di antarmuka admin.

Dekan
sumber

Jawaban:

203

Anda dapat menghapus QuerySet apa pun yang Anda inginkan. Misalnya, untuk menghapus semua posting blog dengan beberapa model Post

Post.objects.all().delete()

dan untuk menghapus Kiriman apa pun dengan tanggal publikasi yang akan datang

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

Namun, Anda perlu menemukan cara untuk mempersempit QuerySet Anda. Jika Anda hanya ingin tampilan untuk menghapus objek tertentu, lihat ke tampilan umum hapus .

EDIT:

Maaf atas kesalahpahaman. Saya pikir jawabannya ada di antara keduanya. Untuk mengimplementasikan tampilan Anda sendiri, gabungkan ModelForms dan tampilan umum . Jika tidak, lihat aplikasi pihak ketiga yang menyediakan fungsi serupa. Dalam pertanyaan terkait , rekomendasinya adalah django-filter .

Matt Luongo
sumber
1
Tidak, Anda telah salah memahami pertanyaan itu. Saya mengerti bahwa saya dapat menghapus semuanya. Tapi saya perlu memilih objek yang akan dihapus dengan formulir di halaman web. Dan kemudian memproses data yang dikembalikan dari formulir di my views.py. Kemudian perulangan melalui apa yang dikembalikan dalam bentuk menghapus sebagai perulangannya melalui data. Tapi saya ingin tahu apa praktik terbaik untuk menerapkan ini di django.
Dean
Ah, salahku! Saya akan menggunakan aplikasi pihak ketiga, atau tampilan umum dengan ModelForms.
Matt Luongo
7
@Dean, lihat tampilan hapus itu. Atau Anda bisa menulis tampilan Anda sendiri ... Maksud saya pada akhirnya Anda mungkin menerima daftar PK dan memanggil hapus pada model Anda ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()dan saya yakin Anda menginginkan sesuatu untuk memastikan orang acak tidak dapat menghapus semua objek di DB Anda dengan menebak PK.
Yuji 'Tomita' Tomita
1
@Dean, sulit untuk menjawab pertanyaan Anda tanpa memahami lebih banyak tentangnya. Anda hanya perlu membuat formulir yang memungkinkan pengguna memilih kriteria penghapusan yang benar (apa pun itu - bahkan mungkin kotak masukan tempat seseorang mengetik nomor ID ... tetapi mungkin lebih kompleks), buat tampilan yang meresponsnya formulir, mungkin melakukan validasi (izin), dan akhirnya menjalankan filter(foo).delete()metode itu.
Yuji 'Tomita' Tomita
1
Salah satu alasan mengapa ini tidak disertakan dengan kerangka kerja adalah pertanyaan tentang otorisasi untuk pengeditan / penghapusan dan kerumitan lain yang disebutkan oleh @YujiTomita. Jika Anda benar-benar membutuhkan pemfilteran yang rumit, periksa django-filtering dan tambahkan tombol hapus yang memanggil QuerySet.delete () jika pengguna diotorisasi.
Matt Luongo