Django: accessing the model instance from within ModelAdmin? Django: accessing the model instance from within ModelAdmin? django django

Django: accessing the model instance from within ModelAdmin?


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


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)


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!