Code

Opened 2 years ago

Last modified 2 years ago

#17881 new New feature

Implement BaseModelAdmin.get_raw_id_fields, similar to get_readonly_fields

Reported by: aaugustin Owned by: nobody
Component: contrib.admin Version: 1.4-beta-1
Severity: Normal Keywords:
Cc: kmike84@… Triage Stage: Accepted
Has patch: yes Needs documentation: yes
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

In order to prevent massive drop downs for related fields when the related model has lots of items, I'd like to add such fields automatically to raw_id_fields.

I've managed to make them read only by implementing the following get_readonly_fields method in the base class that all my ModelAdmin classes inherit:

MODELS_WITH_TOO_MANY_INSTANCES_FOR_ADMIN_SELECT = [
    'auth.User',
    # ...
}

class ModelAdmin(admin.ModelAdmin):

    def get_readonly_fields(self, request, obj=None):
        explicit_readonly_fields = super(ModelAdmin, self).get_readonly_fields(request, obj)
        automatic_readonly_fields = self.related_fields_with_too_many_instances()
        return tuple(set(explicit_readonly_fields) | set(automatic_readonly_fields))

    def related_fields_with_too_many_instances(self):
        fields = []
        for f in self.model._meta.fields:
            # If the field isn't shown anyway, don't bother.
            if self.fields and not f.name in self.fields:
                continue
            # If we made the field editable by id, that means we want to edit it, even if it's impractical
            if f.name in self.raw_id_fields:
                continue
            # If the field is a ForeignKey to a blacklisted model, make it read only.
            if isinstance(f, (django_models.ForeignKey, django_models.ManyToManyField)):
                related_model = '%s.%s' % (f.rel.to._meta.app_label, f.rel.to._meta.object_name)
                if related_model in MODELS_WITH_TOO_MANY_INSTANCES_FOR_ADMIN_SELECT:
                    fields.append(f.name)
        return fields

However, power users occasionally complain that they can no longer edit these fields... which is why I'd like a get_raw_id_fields method that I could override.

Attachments (1)

17881-poc.patch (2.0 KB) - added by aaugustin 2 years ago.

Download all attachments as: .zip

Change History (4)

comment:1 Changed 2 years ago by aaugustin

  • Has patch set

I'm uploading an untested patch showing the idea.

It'd be nice if get_raw_id_fields accepted an optional obj argument, but apparently, this information isn't available in the formfield_for_* methods. This needs more investigation.

Changed 2 years ago by aaugustin

comment:2 Changed 2 years ago by julien

  • Needs documentation set
  • Needs tests set
  • Triage Stage changed from Unreviewed to Accepted

comment:3 Changed 2 years ago by kmike

  • Cc kmike84@… added

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.