2

我有一个名为 Access 的模型,它链接到其他两个模型。

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 显示为一个选择字段,为我提供了所有用户的列表(即“jane15”、“tom54”)。我希望它是一个必须有人输入用户名的文本字段。当我尝试如下自定义它时,它显示“用户 ID”而不是“用户名”(即“1”、“2”)。

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

如何让表单集显示和接受用户名(即“jane15”)作为文本字段而不是选择字段?

4

1 回答 1

1

好吧,如果您想输入用户名,选择字段不是要走的路。

使用 a CharFieldwhich is a<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

将其传递到您的表单集中,您就完成了。

于 2011-03-06T01:21:12.983 回答