2010-10-31 48 views
0

在django管理员,我有一个内联,我想让查看用户自动填写。在clean函数中,它使用request.user填充created_by字段。问题是由于表格排除了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

ORIGINAL建议:

为什么不干脆离开现场的地方,而不是排除,然后使它成为一个hiddeninput?

类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  

SUGGESTION#2(因为隐藏字段仍然在列标题出现在内置):

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

(无论是通过在请求以保存(),如果可以的话,或将其添加到self缓存它在init,或者你似乎已经做到使用它作为一个类级别的变量。)

+0

不会因为这方面的工作:http://imgur.com/fbajE.png – priestc 2010-10-31 19:25:13

+0

在这种情况下,它的时间为一个重构。参见上面的编辑示例 – 2010-10-31 21:07:33

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) 
相关问题