我有一个简单的管理表单:
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 的
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
这将是工作机制。