2011-03-06 101 views
2

我有一個名爲Access的模型鏈接到兩個其他模型。自定義inline_formset字段顯示外鍵

class Access (models.Model): 
    portfolio_id = models.ForeignKey(Portfolio) 
    user_id = models.ForeignKey(User) 
    title = models.CharField(max_length=30, null=True, blank=True) 
    access_rights = models.PositiveIntegerField(choices=ACCESS_CHOICES) 

我已創建此表單。

class UserAccessForm(forms.ModelForm): 
    class Meta: 
    model = Access 

我有這個看法。

AccessFormSet = inlineformset_factory(Portfolio, 
             Access, 
             form=UserAccessForm, 
             extra=1, 
             can_delete=False) 
cAccessFormSet = AccessFormSet(instance=cPorfolio) 

的問題是在網頁中,USER_ID顯示爲choicefield給了我所有用戶的列表(即「jane15」,「tom54」)。我希望它是一個文本字段,有人必須輸入用戶名。當我嘗試按如下所述對其進行自定義時,它會顯示「用戶ID」而不是「用戶名」(即「1」,「2」)。

class UserAccessForm(forms.ModelForm): 
    user_id = forms.ChoiceField(required=True, widget=forms.TextInput) 
    class Meta: 
     model = Access 

我如何獲得該formset顯示和接受用戶名(即「jane15」)作爲一個文本框,而不是作爲一個choicefield?

回答

1

那麼,如果你想輸入用戶名,選擇字段是不是要走的路。

使用CharField這是一個<input type='text'>並覆蓋clean_FOO方法來驗證輸入到用戶實例或引發錯誤消息。

class UserAccessForm(forms.ModelForm): 
    user_id = forms.CharField() 

    class Meta: 
     model = Access 

    def clean_user_id(self): 
     data = self.cleaned_data.get('user_id') 
     try: 
      user = User.objects.get(username=data) 
     except User.DoesNotExist: 
      raise forms.ValidationError("No user exists by that username") 
     return user 

將它傳遞到您的formset中即可。

+0

這就是我已經嘗試過的。這會導致我的用戶顯示爲他們的用戶標識而不是他們的用戶名。出於安全原因,我需要用戶名並且沒有下拉列表。 – 2011-03-12 01:04:42

+0

不幸的是,您可以覆蓋添加功能,但在查看數據時,實際表字段只有一個數字。 – 2011-03-12 03:42:07

+0

是的,那是我的問題。我該如何解決這個問題? – 2011-03-13 20:08:17