61
I think you might need to approach this in a slightly different way – by modifying the ModelForm, rather than the admin class. Something like this:
class OrderForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
self.fields['parent_order'].queryset = Order.objects.filter(
child_orders__ordernumber__exact=self.instance.pk)
class OrderAdmin(admin.ModelAdmin):
form = OrderForm
9
I’ve modeled my inline class this way.
It’s a bit ugly on how it gets the parent form id to filter inline data, but it works. It filters units by company from the parent form.
The original concept is explained here http://www.stereoplex.com/blog/filtering-dropdown-lists-in-the-django-admin
class CompanyOccupationInline(admin.TabularInline):
model = Occupation
# max_num = 1
extra = 0
can_delete = False
formset = RequiredInlineFormSet
def formfield_for_dbfield(self, field, **kwargs):
if field.name == 'unit':
parent_company = self.get_object(kwargs['request'], Company)
units = Unit.objects.filter(company=parent_company)
return forms.ModelChoiceField(queryset=units)
return super(CompanyOccupationInline, self).formfield_for_dbfield(field, **kwargs)
def get_object(self, request, model):
object_id = resolve(request.path).args[0]
try:
object_id = int(object_id)
except ValueError:
return None
return model.objects.get(pk=object_id)
- [Django]-Order by count of a ForeignKey field?
- [Django]-How can I tell the Django ORM to reverse the order of query results?
- [Django]-Django: dependencies reference nonexistent parent node
3
The above answer from Erwin Julius worked for me, except I found that the name “get_object” conflicts with a Django function so name the function “my_get_object”.
class CompanyOccupationInline(admin.TabularInline):
model = Occupation
# max_num = 1
extra = 0
can_delete = False
formset = RequiredInlineFormSet
def formfield_for_dbfield(self, field, **kwargs):
if field.name == 'unit':
parent_company = self.my_get_object(kwargs['request'], Company)
units = Unit.objects.filter(company=parent_company)
return forms.ModelChoiceField(queryset=units)
return super(CompanyOccupationInline, self).formfield_for_dbfield(field, **kwargs)
def my_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)
It told me not to “respond” to others’ answers, but I’m not allowed to “reply” yet, and I have been looking for this for a while so hope this will be helpful to others. I am also not allowed to upvote yet or I totally would!
- [Django]-Iterate over model instance field names and values in template
- [Django]-Accessing function as attribute in a Python class
- [Django]-Django – iterate number in for loop of a template