排除表单字段,然后将其添加回clean()

时间:2010-10-31 18:43:57

标签: django django-admin django-forms

在django管理员中,我有一个内联,我希望自动填写查看用户。在clean功能期间,它会使用created_by填充request.user字段。问题是,由于表单排除了created_by字段,因此插入cleaned_fields的值显然会被忽略。我怎样才能做到这一点?我希望小部件根本不显示。

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)

2 个答案:

答案 0 :(得分:2)

原始建议:

为什么不将场地留在原地,而不是将其排除,然后将其作为隐藏输入?

class NoteForm(forms.ModelForm):

def __init__(*args, **kwargs):
   super(NoteForm, self).__init__(*args, **kwargs)

   self.fields['created_by'].widget = forms.widgets.HiddenInput()


#rest of your form code follows, except you don't exclude 'created_by' any more    

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

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

(如果可以,请传递save()请求,或者通过将其添加到self将其缓存在init中,或者将其用作类似级别的变量,如您所见。 )

答案 1 :(得分:0)

我的解决方案是编辑Inline的formfield_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)