get_form_kwargs 被省略

问题描述 投票:0回答:1

我有一个简单的管理表单:

class SomeForm(forms.ModelForm):
    
    class Meta:
        model = Process
        fields = ["start", "end", "result", "description", "user"]

    def __init__(self, user=None, *args, **kwargs):
        user = kwargs.pop("user", None)    
        super().__init__(*args, **kwargs)
        self.fields["user"].initial = user

该表单正在由普通模型管理员实例化:

class SomeAdmin(admin.ModelAdmin):
    form = SomeForm

    def get_form_kwargs(self, request):
        return {"user": request.user}
    
    def get_form(self, request, obj=None, change=False, **kwargs):
        form = super().get_form(request, obj, change, **kwargs, **self.get_form_kwargs(request))
        return form

print
语句的输出在终端中永远不可见。为什么?我希望能够访问“用户”作为表单中的初始值:

编辑:根据@Willem Van Onsem的输入更新代码(仍然不起作用:错误:

TypeError
modelform_factory() got an unexpected keyword argument 'user'
。)

django django-forms django-admin
1个回答
0
投票

Django 的

ModelAdmin
没有
get_form_kwargs
,是的,我知道这很奇怪,因为它有一个
.get_formset_kwargs(…)
 [Django-doc]
。但是,好吧,
ModelAdmin
有点错误,特别是因为它是不同视图的集合,但它基本上违反了 Django 视图实现的所有模式。例如,它不会创建视图的实例,因此无法访问
self.request
,因为那是
ModelAdmin
,而不是视图对象。

我们可以做到这一点,但它是丑陋,不,真的。首先我们更新表单以使用

self._user
作为属性:

class SomeForm(forms.ModelForm):
    _user = None

    class Meta:
        model = Process
        fields = ['start', 'end', 'result', 'description', 'user']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['user'].initial = self._user

现在我们可以每次子类化并将用户作为属性注入:

class SomeAdmin(admin.ModelAdmin):

    def get_form(self, reqmuest, obj=None, change=False, **kwargs):
        class SubSomeForm(SomeForm):
            _user = request.user
        return SomeSubForm

这将是工作机制。

© www.soinside.com 2019 - 2024. All rights reserved.