Fea*_*nor 5 django django-admin
如您所知,我们可以定义ModelForm,然后通过在modelAdmin类中设置form属性来替换添加和更改表单。例如:
class FooAdminForm(django.forms.ModelForm):
     class Meta:
         model = Foo
     def __init__(self, *args, **kwargs):
         super(FooAdminForm, self).__init__(self, *args, **kwargs)
class FooAdmin(admin.ModelAdmin):
    form = FooAdminForm
Run Code Online (Sandbox Code Playgroud)
在一个简单的视图中,我们可以初始化一个表单对象,并将额外的参数传递给表单的init函数。像这样的东西:
def my_view(request):
    form = FooAdminForm(p1='aaa', p2='bbb')
Run Code Online (Sandbox Code Playgroud)
然后在init函数中,我们可以访问这些参数。
self.p1 = kwargs.pop('p1')
self.p2 = kwargs.pop('p2')
Run Code Online (Sandbox Code Playgroud)
但是如何将参数传递给modelAdmin表单?我只能将表单类传递给modelAdmin表单属性,而不能像在视图中那样将其初始化。
我在这里找到了关于stackoverflow的解决方案:
在Django Admin中使用带有自定义__init__的表单
但是它向表单对象添加了动态属性,我认为这有点怪异。是否有更好的或正式的方法来执行此操作?
Mat*_*kel -1
因为ModelAdmin.get_form行为与 不太一样FormView.get_form,所以你需要有点偷偷摸摸:
https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_form
class FooAdmin(admin.ModelAdmin):
    form = FooAdminForm
    def get_form(self, request, obj=None, **kwargs):
        form_class = super().get_form(request, obj, **kwargs)
        class Form(form_class):
            def __init__(self, *args, **kwargs):
                kwargs.update(foo='bar')
                super().__init__(self, *args, **kwargs)
        return Form
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1190 次  |  
        
|   最近记录:  |