Skip to main content
 首页 » 编程设计

python之自定义外键的inline_formset字段显示

2025年05月04日9del

我有一个名为 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 

我在 View 中有这个。

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”)作为文本字段而不是选择字段?

请您参考如下方法:

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

使用 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 

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