在表格内联中访问request.user

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

我有一个

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
。我如何访问用户

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

它非常丑陋,但这可以通过构造一个临时表单类来完成:

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,
    ]

但我承认它很丑,不真的,非常丑。

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