Code

Opened 6 years ago

Last modified 5 months ago

#8851 new New feature

Please add a default option to list_filter in the admin interface

Reported by: Riskable <riskable@…> Owned by: nobody
Component: contrib.admin Version: master
Severity: Normal Keywords: admin, list_filter, default
Cc: carljm, trevor, rlaager@…, andy@…, wizard@…, kc9ddi, remco@…, net147 Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

There should be a way to set a default list_filter in the admin interface. For example, if I had a model like this:

DECOM_CHOICES = (
        ('N', 'No'),
        ('Y', 'Yes'),
)

class Host(models.Model):
        hostname = models.CharField(max_length=36, unique=True)
        decommissioned = models.CharField(max_length=1, choices=DECOM_CHOICES, default='N')
        ip_address = models.IPAddressField()
        def __unicode__(self):
                return self.hostname

class HostAdmin(admin.ModelAdmin):
        fieldsets = [
                ('Host Info', {'fields': ['hostname','decommissioned','ip_address']}),
        list_display = ('hostname', 'ip_address', 'decommissioned')
        list_filter = ('decommissioned')

admin.site.register(Host, HostAdmin)

I might want to make it so that by default only hosts that are not marked as decommissioned are displayed by default in the index. It would be nice if I could just pass an option to list_filter to set the a filter that is enabled by default. Perhaps something like this:

list_filter = ('decommissioned__exact=N') # Matches the URL if you click on "No" in the filter list

...or perhaps...

list_filter = ('decommissioned__default') # Have it choose the same default as specified in the model.

If there's already a simple way to do this I haven't found it and would appreciate an example.

Thanks!

Attachments (0)

Change History (20)

comment:1 Changed 6 years ago by mtredinnick

  • milestone 1.0 deleted
  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

comment:2 Changed 5 years ago by jacob

  • Triage Stage changed from Unreviewed to Accepted

Not a big fan of the syntax, but a useful feature.

comment:3 Changed 5 years ago by Riskable

The syntax doesn't matter... The feature is what matters =). If you're going to implement this you can do it however you like (and I thank you!).

comment:4 Changed 5 years ago by nitipit

  • Resolution set to fixed
  • Status changed from new to closed

That's a great idea to add this feature.
for now, I make a bit hack of code to set django.contrib.admin.filterspecs.RelatedFilterSpec.lookup_choices to get objects from "ModelAdmin.formfield_for_foreignkey()"

class RelatedFilterSpec(FilterSpec):
    def __init__(self, f, request, params, model, model_admin):
        super(RelatedFilterSpec, self).__init__(f, request, params, model, model_admin)
        if isinstance(f, models.ManyToManyField):
            self.lookup_title = f.rel.to._meta.verbose_name
        else:
            self.lookup_title = f.verbose_name
        rel_name = f.rel.get_related_field().name
        self.lookup_kwarg = '%s__%s__exact' % (f.name, rel_name)
        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
#       self.lookup_choices = f.rel.get_choices(include_blank=False); >> f.rel.get_choices will return lists of object tuple
        self.lookup_choices = [] ;
        for object in model_admin.formfield_for_foreignkey(f,request).queryset :
            list = (object.id,object.__str__()) ;
            self.lookup_choices.append(list);

Then just use formfield_for_foreignkey() which is described in django document to filter the objects we want.

comment:5 Changed 5 years ago by kmtracey

  • Resolution fixed deleted
  • Status changed from closed to reopened

A workaround in a comment doesn't make the ticket fixed. The ticket is fixed when a change is checked into the Django source tree.

comment:6 Changed 5 years ago by carljm

  • Cc carljm added

comment:7 Changed 5 years ago by anonymous

  • Cc trevor added

comment:8 Changed 5 years ago by anonymous

  • Cc rlaager@… added

comment:9 Changed 4 years ago by anonymous

  • Cc andy@… added

comment:10 Changed 4 years ago by wizard@…

  • Cc wizard@… added

Is this something that just needs committing?

comment:11 Changed 4 years ago by kc9ddi

  • Cc kc9ddi added

comment:12 Changed 3 years ago by shanx

  • Cc remco@… added

comment:13 Changed 3 years ago by lukeplant

  • Severity set to Normal
  • Type set to New feature

comment:14 Changed 3 years ago by mofle

  • Easy pickings unset

This would be very useful. Hoping for this in 1.4.

There is a ugly workaround on StackOverflow, but this does not show the default filter in the filterbar.

comment:15 Changed 2 years ago by aaugustin

  • UI/UX unset

Change UI/UX from NULL to False.

comment:16 Changed 22 months ago by net147

  • Cc net147 added

comment:17 Changed 20 months ago by charettes

I think you can achieve this in 1.4+ by subclassing django.contrib.admin.ChoicesFieldListFilter.

comment:18 Changed 16 months ago by aaugustin

  • Status changed from reopened to new

comment:19 Changed 14 months ago by oinopion

  • Resolution set to fixed
  • Status changed from new to closed

This feature has been already introduced in Django, unfortunately, I don't know when. Basically, subclass SimpleListFilter and override two methods lookups and queryset. You can read about it in ModelAdmin.list_filter docs

I'm closing this ticket as fixed, as described feature is in my opinion what you were looking for. If you feel it's not what you need, please reopen with detailed description what should be changed.

comment:20 Changed 5 months ago by schrinaw@…

  • Resolution fixed deleted
  • Status changed from closed to new

I would argue that this is not fixed. I believe I have the same issue as the OP - I want to choose which of the available filter options should be selected by default. I don't want to customize the filtering behavior by subclassing SimpleListFilter. The desired behavior is that when I go to admin changelist url, it is *as if I had already chosen one of the filtering options*. I don't want to change the behavior of the filtering options. I just want one (the defined default) to be pre-selected.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as new
The owner will be changed from nobody to anonymous. Next status will be 'assigned'
as The resolution will be set. Next status will be 'closed'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.