3

I want to override the get_form in a tabular admin in order to filter by current user. The thing is that I'm getting a error:

 object has no attribute 'current_user'
  • Admin.py

    class InvoiceDetail(admin.TabularAdmin):
        form = InvoiceDetailForm
        model = fa_invoice_lines
    
        def get_form(self, request, obj=None, **kwargs):
            form = super(InvoiceDetail, self).get_form(request, obj, **kwargs)
            form.current_user = request.user
            return form
    
    class Invoice(admin.ModelAdmin)
        form = InvoiceForm
        inlines =   [InvoiceDetail,]
    
  • Form.py

    class InvoiceDetailForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(InvoiceDetailForm, self).__init__(*args, **kwargs)
            self.fields['item'].queryset = fa_items.objects.filter(tenant=self.current_user)
    
        class Meta:
            model = fa_invoice_lines
    

I have used the same strategy in not inlines and it works It seems is not calling the get_form

M.javid
  • 6,387
  • 3
  • 41
  • 56
NeDiaz
  • 349
  • 3
  • 14

2 Answers2

5

Inspired from the docs, I have implemented the following solution:

class Invoice(admin.ModelAdmin)
    form = InvoiceForm
    inlines =   [InvoiceDetail,]

def get_formsets_with_inlines(self, request, obj=None):
    for inline in self.get_inline_instances(request, obj):
        inline.form.current_user = request.user
        yield inline.get_formset(request, obj), inline
raratiru
  • 8,748
  • 4
  • 73
  • 113
4

admin.TabularAdmin does not have a get_form method. The get_form function you defined is never being called.

You might want to look into get_formset method.

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.get_formset

Luca Bezerra
  • 1,160
  • 1
  • 12
  • 23
Zahid
  • 538
  • 3
  • 11