Untuk mencapai hal ini dan memiliki link 'Semua' yang dapat digunakan di sidebar Anda (yaitu yang menampilkan semua daripada menampilkan menunggu), Anda perlu membuat filter daftar kustom, mewarisi dari django.contrib.admin.filters.SimpleListFilter
dan memfilter 'tertunda' secara default. Sesuatu seperti ini seharusnya bekerja:
from datetime import date
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
class StatusFilter(SimpleListFilter):
title = _('Status')
parameter_name = 'status'
def lookups(self, request, model_admin):
return (
(None, _('Pending')),
('activate', _('Activate')),
('rejected', _('Rejected')),
('all', _('All')),
)
def choices(self, cl):
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == lookup,
'query_string': cl.get_query_string({
self.parameter_name: lookup,
}, []),
'display': title,
}
def queryset(self, request, queryset):
if self.value() in ('activate', 'rejected'):
return queryset.filter(status=self.value())
elif self.value() == None:
return queryset.filter(status='pending')
class Admin(admin.ModelAdmin):
list_filter = [StatusFilter]
EDIT: Membutuhkan Django 1.4 (terima kasih Simon)
choices
metode dalam solusi, itu akan terus menambahkan opsi Semua miliknya sendiri di bagian atas daftar pilihan.sumber
Mengambil jawaban ha22109 di atas dan dimodifikasi untuk memungkinkan pemilihan "Semua" dengan membandingkan
HTTP_REFERER
danPATH_INFO
.sumber
KeyError
, sedangkan jika Anda menggunakan metode dictget()
Anda dapat menentukan default. Saya menetapkan default string kosong sehingga split () tidak melemparAttributeError
. Itu saja.has_key()
tidak digunakan lagi karena mendukungkey in d
. Tapi saya tahu Anda baru saja mengambil dari jawaban ha22109. Satu pertanyaan: mengapa menggunakanrequest.META['PATH_INFO']
saat Anda bisa menggunakanrequest.path_info
(lebih pendek)?Saya tahu pertanyaan ini sudah cukup tua sekarang, tetapi masih valid. Saya yakin ini adalah cara paling benar untuk melakukan ini. Ini pada dasarnya sama dengan metode Greg, tetapi diformulasikan sebagai kelas yang dapat diperpanjang agar mudah digunakan kembali.
sumber
Berikut adalah solusi umum saya menggunakan redirect, itu hanya memeriksa apakah ada parameter GET, jika tidak ada maka itu mengalihkan dengan parameter get default. Saya juga memiliki set list_filter sehingga mengambilnya dan menampilkan default.
Satu-satunya peringatan adalah ketika Anda melakukan akses langsung ke halaman dengan "?" ada di url, tidak ada set HTTP_REFERER sehingga akan menggunakan parameter default dan pengalihan. Ini bagus untuk saya, ini berfungsi dengan baik saat Anda mengeklik melalui filter admin.
MEMPERBARUI :
Untuk mengatasi peringatan tersebut, saya akhirnya menulis fungsi filter khusus yang menyederhanakan fungsi changelist_view. Berikut filternya:
Dan changelist_view sekarang hanya meneruskan parameter default jika tidak ada. Idenya adalah untuk menghilangkan kemampuan filter generik untuk melihat semua dengan menggunakan parameter no get. Untuk melihat semua, saya menetapkan status = 8 untuk tujuan itu .:
sumber
sumber
Anda cukup menggunakan
return queryset.filter()
atauif self.value() is None
dan metode Override dari SimpleListFiltersumber
Perhatikan bahwa jika alih-alih memilih nilai filter sebelumnya, Anda ingin selalu memfilter data terlebih dahulu sebelum menampilkannya di admin, Anda harus mengganti
ModelAdmin.queryset()
metode tersebut.sumber
Sedikit perbaikan pada jawaban Greg menggunakan DjangoChoices, Python> = 2.5 dan tentu saja Django> = 1.4.
Terima kasih kepada Greg untuk solusi yang bagus!
sumber
Saya tahu itu bukan solusi terbaik, tetapi saya mengubah index.html di template admin, baris 25 dan 37 seperti ini:
25:
<th scope="row"><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag_flag__exact=1{% endifequal %}">{{ model.name }}</a></th>
37:
<td><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag__exact=1{% endifequal %}" class="changelink">{% trans 'Change' %}</a></td>
sumber
Saya harus membuat modifikasi agar pemfilteran berfungsi dengan benar. Solusi sebelumnya berfungsi untuk saya saat halaman dimuat. Jika 'tindakan' dilakukan, filter kembali ke 'Semua' dan bukan default saya. Solusi ini memuat halaman perubahan admin dengan filter default, tetapi juga mempertahankan perubahan filter atau filter saat ini ketika aktivitas lain terjadi di halaman. Saya belum menguji semua kasus, tetapi pada kenyataannya mungkin membatasi pengaturan filter default hanya terjadi saat halaman dimuat.
sumber
Agak di luar topik tetapi pencarian saya untuk pertanyaan serupa membawa saya ke sini. Saya ingin memiliki kueri default berdasarkan tanggal (yaitu jika tidak ada masukan yang disediakan, tampilkan hanya objek dengan
timestamp
'Hari Ini'), yang sedikit memperumit pertanyaan. Inilah yang saya dapatkan:Ini adalah penggantian sederhana dari default
DateFieldListFilter
. Dengan mengaturself.date_params
, ini memastikan bahwa dropdown filter akan diperbarui ke opsi apa pun yang cocok denganself.used_parameters
. Untuk alasan ini, Anda harus memastikan bahwaself.used_parameters
persis apa yang akan digunakan oleh salah satu pilihan dropdown tersebut (yaitu, cari tahudate_params
jadinya saat menggunakan 'Hari Ini' atau '7 Hari Terakhir' dan membuatself.used_parameters
untuk mencocokkannya).Ini dibangun untuk bekerja dengan Django 1.4.10
sumber
Ini mungkin utas lama, tetapi saya pikir saya akan menambahkan solusi saya karena saya tidak dapat menemukan jawaban yang lebih baik di pencarian google.
Lakukan apa (tidak yakin apakah Deminic Rodger, atau ha22109) dijawab di ModelAdmin untuk changelist_view
Kemudian kita perlu membuat SimpleListFilter kustom
sumber
Inilah versi Terbersih yang dapat saya buat dari filter dengan 'Semua' yang didefinisikan ulang dan nilai Default yang dipilih.
Jika menunjukkan kepada saya secara default, Perjalanan sedang berlangsung.
sumber
Membuat sub-kelas Filter yang dapat digunakan kembali, terinspirasi oleh beberapa jawaban di sini (kebanyakan Greg).
Keuntungan:
Dapat digunakan kembali - Dapat dicolokkan di semua
ModelAdmin
kelas standarDapat diperpanjang - Mudah untuk menambahkan logika tambahan / khusus
QuerySet
pemfilteranMudah digunakan - Dalam bentuk paling dasar, hanya satu atribut khusus dan satu metode khusus yang perlu diterapkan (selain yang diperlukan untuk subkelas SimpleListFilter)
Admin intuitif - Tautan filter "Semua" berfungsi seperti yang diharapkan; seperti yang lainnya
Tidak ada pengalihan - Tidak perlu memeriksa
GET
muatan permintaan, agnostikHTTP_REFERER
(atau hal terkait permintaan lainnya, dalam bentuk dasarnya)Tidak ada manipulasi tampilan (daftar perubahan) - Dan tidak ada manipulasi template (amit-amit)
Kode:
(sebagian besar
import
hanya untuk petunjuk dan pengecualian tipe)Contoh penggunaan lengkap:
Semoga ini bisa membantu seseorang; umpan balik selalu dihargai.
sumber