Django: accessing the model instance from within ModelAdmin?

后端 未结 3 1009
情话喂你
情话喂你 2020-11-29 21:50

I\'ve got a model for Orders in a webshop application, with an auto-incrementing primary key and a foreign key to itself, since orders can be split into multiple orders, but

相关标签:
3条回答
  • 2020-11-29 22:06

    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!

    0 讨论(0)
  • 2020-11-29 22:14

    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
    
    0 讨论(0)
  • 2020-11-29 22:21

    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)
    
    0 讨论(0)
提交回复
热议问题