2011-03-06 99 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