【问题标题】:django: Override get_Form inlinesdjango:覆盖 get_Form 内联
【发布时间】:2015-03-08 06:21:42
【问题描述】:

我想在表格管理员中覆盖get_form,以便按当前用户进行过滤。 问题是我遇到了一个错误:

 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
    

我在非内联中使用了相同的策略并且它有效 好像没有调用get_form

【问题讨论】:

  • 我看到提供了“一些帮助”,但我也明白它不被欣赏甚至不被接受。

标签: python django django-admin inlines


【解决方案1】:

the docs的启发,我实现了以下解决方案:

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

【讨论】:

    【解决方案2】:

    admin.TabularAdmin 没有get_form 方法。 您定义的 get_form 函数永远不会被调用。

    您可能想研究get_formset 方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2015-02-14
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多