#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: | dev |
| 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 )
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 by , 12 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 12 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|---|
| Type: | Uncategorized → Cleanup/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:5 by , 7 years ago
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 by , 6 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:8 by , 6 years ago
| Patch needs improvement: | set |
|---|
comment:10 by , 5 years ago
| Patch needs improvement: | set |
|---|
comment:11 by , 5 years ago
| Patch needs improvement: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
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..."