如何解决Django Modelforms:如何显示CharField的选择?
我正在Django中使用ModelForms创建表单。这很好。但是,数据库中有一个字段是charfield,但是对于特定的表单,我想将用户可以输入的选项限制为特定项的列表-理想情况下显示为<select>
。正确的方法是什么?这是我的代码:
form = ModelForm(request.POST or None,instance=Street.objects.get(pk=1))
在我的模型中:
class Street(models.Model):
name = models.CharField(max_length=255)
我尝试了以下操作:
from django import forms
CHOICES = [('1','First'),('2','Second')]
choice_field = forms.ChoiceField(widget=forms.Select,choices=CHOICES)
form.fields["street"].widget = choice_field
哪个出现此错误:
'ChoiceField' object has no attribute 'attrs'
解决方法
使用ModelForm
的首选方法是创建自己的类:
class StreetForm(forms.ModelForm):
class Meta:
model = Street
fields = '__all__'
这将创建一个表单,用于编辑Street
之类的name
属性。
如果您要创建一个包含街道可供选择的表单,则应定义一个新表单-如果ModelForm
与另一个模型有关联(即由ForeignKey定义),则另一个Street
,否则为普通的Form
。
假设第二种情况,您应该定义:
class OtherForm(forms.Form):
street = forms.ModelChoiceField(queryset=Street.objects.all())
要缩小狭窄的街道,您有两种选择,具体取决于过滤条件。
对于静态过滤(条件在运行时不会更改),您可以通过定义过滤的查询集来缩小记录范围:
class OtherForm(forms.Form):
street = forms.ModelChoiceField(
queryset=Street.objects.filter(name__ilike='a%')
)
对于动态过滤,您可以使用__init__
方法覆盖字段的queryset实例:
class OtherForm(forms.Form):
street = forms.ModelChoiceField(
queryset=Street.objects.all()
)
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs) # must be called first
self.fields["street"].queryset = Street.objects.filter(...)
ModelChoiceField
的默认小部件是Select
小部件。
但是,如果您需要为街道名称准备自定义选项,则应定义一个选项列表(如您的示例所示),然后重新定义name
的{{1}}字段:
StreetForm
,
如果您想解决此属性错误,则可以将选择作为python Tuple传递或设置TypedChoiceField()并为其赋予属性强制引用:https://stackoverflow.com/a/18200849/14127147
from django import forms
CHOICES = (("1","First"),("2","Second"))
choice_field = forms.ChoiceField(widget=forms.Select,choices=CHOICES)
form.fields["street"].widget = choice_field
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。