我有一个
ModelForm
和多个 TabularInline
,我想在管理员中使用。我想知道哪个用户使用内联更改了某些内容。
class ResourceForm(forms.ModelForm):
resource = forms.FileField(widget=CustomImageFile, ...)
class Meta:
model = Resource
fields = ["resource"]
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user")
super().__init__(*args, **kwargs)
self.fields["resource"].widget.form_instance = self
def clean(self):
# i need the request.user here
class ResourceTabularInline(TabularInline):
model = Resource
form = ResourceForm
def get_formset(self, request, obj=None, **kwargs):
formset = super().get_formset(request, obj, **kwargs)
formset.user = request.user # <-- I hoped this would be in the kwargs later on
return formset
class FooAdmin(admin.ModelAdmin):
inlines = [ResourceTabularInline,]
不幸的是,关键
user
不在 __init__()
方法的 kwargs 中 -> KeyError
。我如何访问用户
它非常丑陋,但这可以通过构造一个临时表单类来完成:
class ResourceTabularInline(TabularInline):
model = Resource
form = ModelForm
def get_formset(self, request, obj=None, **kwargs):
class ResourceForm(forms.ModelForm):
user = request.user
resource = forms.FileField(widget=CustomImageFile)
class Meta:
model = Resource
fields = ['resource']
self.fields["resource"].widget.form_instance = self
def clean(self):
# use self.user
pass
return super().get_formset(request, obj, **kwargs, form=ResourceForm)
class FooAdmin(admin.ModelAdmin):
inlines = [
ResourceTabularInline,
]
但我承认它很丑,不真的,非常丑。