2010-10-31 50 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) 
相關問題