Opened 7 years ago

Closed 4 weeks ago

Last modified 4 weeks ago

#21528 closed Cleanup/optimization (fixed)

improve Django Doc with an example for formfield_for_foreignkey accessing parent ID

Reported by: anonymous Owned by: Caio Ariede
Component: Documentation Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
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 (14)

comment:1 Changed 7 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 7 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 4 years ago by Tim Graham

Has patch: set

comment:4 Changed 4 years ago by Tim Graham

Patch needs improvement: set

Left comments for improvement.

comment:5 Changed 16 months 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.

comment:6 Changed 9 months ago by Caio Ariede

Owner: changed from nobody to Caio Ariede
Status: newassigned

comment:7 Changed 9 months ago by Caio Ariede

Patch needs improvement: unset

comment:8 Changed 8 months ago by felixxm

Patch needs improvement: set

comment:9 Changed 5 weeks ago by felixxm

Patch needs improvement: unset

comment:10 Changed 5 weeks ago by felixxm

Patch needs improvement: set

comment:11 Changed 4 weeks ago by felixxm

Patch needs improvement: unset
Triage Stage: AcceptedReady for checkin

comment:12 Changed 4 weeks ago by Mariusz Felisiak <felisiak.mariusz@…>

Resolution: fixed
Status: assignedclosed

In d38c3411:

Fixed #21528 -- Added note about filtering form field's queryset based on instance to admin docs.

comment:13 Changed 4 weeks ago by Mariusz Felisiak <felisiak.mariusz@…>

In 7fe7d832:

[3.1.x] Fixed #21528 -- Added note about filtering form field's queryset based on instance to admin docs.

Backport of d38c34119e91a533c797098f150abe99b5ee2fd8 from master

comment:14 Changed 4 weeks ago by Mariusz Felisiak <felisiak.mariusz@…>

In 96b04f5:

[3.0.x] Fixed #21528 -- Added note about filtering form field's queryset based on instance to admin docs.

Backport of d38c34119e91a533c797098f150abe99b5ee2fd8 from master

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