我有一个名为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
如何让formset显示并接受用户名(即“jane15”)作为文本字段而不是作为选择字段?
答案 0 :(得分: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中,然后就完成了。