Django 排除表单字段,但使用clean()将其添加回

Django 排除表单字段,但使用clean()将其添加回,django,django-admin,django-forms,Django,Django Admin,Django Forms,在django管理员中,我有一个内联代码,希望查看用户自动填写该代码。在clean功能期间,它用request.user填充created\u by字段。问题在于,由于表单排除了由创建的字段,因此插入到cleaned_字段中的值显然会被忽略。我该怎么做?我希望小部件根本不显示 class NoteInline(admin.TabularInline): model = Note extra = 1 can_delete = False def get_forms

在django管理员中,我有一个内联代码,希望查看用户自动填写该代码。在
clean
功能期间,它用
request.user
填充
created\u by
字段。问题在于,由于表单排除了由创建的
字段,因此插入到
cleaned_字段
中的值显然会被忽略。我该怎么做?我希望小部件根本不显示

class NoteInline(admin.TabularInline):
    model = Note
    extra = 1
    can_delete = False

    def get_formset(self, request, obj=None, **kwargs):
        """
        Generate a form with the viewing CSA filled in automatically
        """

        class NoteForm(forms.ModelForm):

            def clean(self):
                self.cleaned_data['created_by'] = request.user
                return self.cleaned_data

            class Meta:
                exclude = ('created_by', )
                model = Note
                widgets = {'note': forms.TextInput(attrs={'style': "width:80%"})}

        return forms.models.inlineformset_factory(UserProfile, Note,
                                                  extra=self.extra,
                                                  form=NoteForm,
                                                  can_delete=self.can_delete)
原始建议:

为什么不把这个领域留在原地,而不是把它排除在外,然后把它变成一个隐藏的输入

课堂笔记形式(forms.ModelForm):

建议#2(因为隐藏字段仍显示在内联的列标题中):

根本不要在clean()方法中设置self.cleaned_数据['created_by']。相反,重写NoteForm.save()并将其设置在那里


(如果可以的话,可以传入save()请求,也可以通过将其添加到
self
将其缓存在init中,或者像您看起来已经做的那样将其用作类级变量。)

我的解决方案是编辑内联的
formfield\u for_foreignkey
函数,这将下拉列表仅限于登录用户

class NoteInline(admin.TabularInline):
    model = Note
    extra = 1
    can_delete = False

    def queryset(self, request):
        return Note.objects.get_empty_query_set()

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'created_by':
            # limit the 'created_by' dropdown box to just the CSR user who is
            # logged in and viewing the page.
            kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
        return super(NoteInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

在这种情况下,是时候进行重构了。参见上面编辑的示例
class NoteInline(admin.TabularInline):
    model = Note
    extra = 1
    can_delete = False

    def queryset(self, request):
        return Note.objects.get_empty_query_set()

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'created_by':
            # limit the 'created_by' dropdown box to just the CSR user who is
            # logged in and viewing the page.
            kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
        return super(NoteInline, self).formfield_for_foreignkey(db_field, request, **kwargs)