Opened 6 years ago

Last modified 8 weeks ago

#21528 new Cleanup/optimization

improve Django Doc with an example for formfield_for_foreignkey accessing parent ID

Reported by: anonymous Owned by: nobody
Component: Documentation Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description (last modified by Aymeric Augustin)

Please,
Could you add an example for formfield_for_foreignkey (
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey) showing how to access parent ID for filtering a foreignkey.

I saw on http://www.stereoplex.com/blog/filtering-dropdown-lists-in-the-django-admin

parent_id = request.META['PATH_INFO'].strip('/').split('/')[-1]

Clearly it's not ideal.

Thanks!

Change History (5)

comment:1 Changed 6 years ago by Aymeric Augustin

Description: modified (diff)

Could you explain a bit more what you're trying to achieve?

To help you, we need something like: "here's my models definition, here's my admin definiton, at this URL ... I would like to..."

comment:2 Changed 6 years ago by Tim Graham

Triage Stage: UnreviewedAccepted
Type: UncategorizedCleanup/optimization

The request is a documentation additional as outlined in the blog post.

It would be nice if there were a cleaner way to achieve the filtering, but until then, I guess we can document this solution.

comment:3 Changed 3 years ago by Tim Graham

Has patch: set

comment:4 Changed 3 years ago by Tim Graham

Patch needs improvement: set

Left comments for improvement.

comment:5 Changed 8 weeks ago by Tobias Kunze

For reference, the blog post referred to in the original issue can be found on the web archive, and the relevant code reads like this:

class MountaineeringInfoInline(admin.TabularInline):
    model = MountaineeringInfo
    formset = MountaineeringInfoInlineFormset

    def formfield_for_dbfield(self, field, **kwargs):
        if field.name == 'area':
            # Note - get_object hasn't been defined yet
            parent_trip = self.get_object(kwargs['request'], Trip)
            contained_areas = Area.objects.filter(area__contains=parent_trip.area.area)
            return forms.ModelChoiceField(queryset=contained_areas)
        return super(MountaineeringInfoInline, self).formfield_for_dbfield(field, **kwargs)

    def get_object(self, request, model):
        object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
        try:
            object_id = int(object_id)
        except ValueError:
            return None
        return model.objects.get(pk=object_id)

At least mentioning formfield_for_dbfield in the docs at all, anywhere, sounds like a good idea to me, regardless of the specifics on how to get the current pk or instance.

Note: See TracTickets for help on using tickets.
Back to Top