Django Modelforms:如何显示字符域的select?
我正在Django中使用ModelForms创建表单。这很有效。然而,数据库中有一个字段是charfield,但是对于一个特定的表单,我想将用户可以输入的选项限制为一个特定项的列表——理想情况下,显示在一个列表中。这样做的正确方式是什么?这是我的密码:Django Modelforms:如何显示字符域的select?,django,django-forms,modelform,Django,Django Forms,Modelform,我正在Django中使用ModelForms创建表单。这很有效。然而,数据库中有一个字段是charfield,但是对于一个特定的表单,我想将用户可以输入的选项限制为一个特定项的列表——理想情况下,显示在一个列表中。这样做的正确方式是什么?这是我的密码: form = ModelForm(request.POST or None, instance=Street.objects.get(pk=1)) 在我的模型中: class Street(models.Model): name = m
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的首选方法是创建自己的类:
类别StreetForms.ModelForm:
类元:
模型=街道
字段='\uuuu所有\uuuu'
这将创建一个表单,用于编辑街道属性,如名称
如果要创建带有街道的表单以供选择,则应定义一个新表单-如果街道与另一个模型(即由ForeignKey定义)相关,则为另一个模型表单,否则为普通表单
假设第二个场景,您应该定义:
类OtherFormforms。表单:
street=forms.ModelChoiceFieldqueryset=street.objects.all
要缩小街道,您有两种选择,具体取决于过滤条件
对于在运行时条件不会更改的静态筛选,您可以通过定义筛选查询集来缩小记录范围:
类OtherFormforms。表单:
street=forms.model选择字段
queryset=Street.objects.filtername\uuu ilike='a%'
对于动态筛选,您可以在_init__方法中重写字段的queryset实例:
类OtherFormforms。表单:
street=forms.model选择字段
queryset=Street.objects.all
定义初始自我,*args,**kwargs:
super.\uuuuu init\uuuu*args,**必须首先调用kwargs
self.fields[street].queryset=street.objects.filter。。。
ModelChoiceField的默认小部件是选择小部件
但是,如果需要为街道名称准备自定义选项,则应像示例中那样定义选项列表,并重新定义街道表单的名称字段:
街道名称选择=[
‘街道名称1’、‘街道名称1’,
“街道名称2”,“街道名称2”
]
类别StreetForms.ModelForm:
name=forms.ChoiceField
widget=forms.Select,
选择=街道名称选择
类元:
模型=街道
字段='\uuuu所有\uuuu'
使用ModelForm的首选方法是创建自己的类:
类别StreetForms.ModelForm:
类元:
模型=街道
字段='\uuuu所有\uuuu'
这将创建一个表单,用于编辑街道属性,如名称
如果要创建带有街道的表单以供选择,则应定义一个新表单-如果街道与另一个模型(即由ForeignKey定义)相关,则为另一个模型表单,否则为普通表单
假设第二个场景,您应该定义:
类OtherFormforms。表单:
street=forms.ModelChoiceFieldqueryset=street.objects.all
要缩小街道,您有两种选择,具体取决于过滤条件
对于在运行时条件不会更改的静态筛选,您可以通过定义筛选查询集来缩小记录范围:
类OtherFormforms。表单:
street=forms.model选择字段
queryset=Street.objects.filtername\uuu ilike='a%'
对于动态筛选,您可以在_init__方法中重写字段的queryset实例:
类OtherFormforms。表单:
street=forms.model选择字段
queryset=Street.objects.all
定义初始自我,*args,**kwargs:
super.\uuuuu init\uuuu*args,**必须首先调用kwargs
self.fields[street].queryset=street.objects.filter。。。
ModelChoiceField的默认小部件是选择小部件
但是,如果需要为街道名称准备自定义选项,则应像示例中那样定义选项列表,并重新定义街道表单的名称字段:
街道名称选择=[
‘街道名称1’、‘街道名称1’,
“街道名称2”,“街道名称2”
]
类别StreetForms.ModelForm:
name=forms.ChoiceField
widget=forms.Select,
选择=街道名称选择
类元:
模型=街道
字段='\uuuu所有\uuuu'
如果要修复此属性错误,可以将选择作为python元组传递,也可以将TypedChoiceField设置为属性强制引用,如下所示:
如果要修复此属性错误,可以将选择作为python元组传递,也可以将TypedChoiceField设置为属性强制引用,如下所示: 您将字段实例指定为小部件。尝试定义:1个自定义表单,如第一个答案中所述,或2个尝试用表单替换字段。字段[street]=选择_字段。首选的方法是1,其中可以将street字段重新定义为类属性。编辑:如果要缩小Street模型的数据库记录范围,请尝试重新定义字段的查询集,即form.fields[Street].queryset=Street.objects.filterpk_uin=1,2您已将字段实例分配为小部件。尝试定义:1个自定义表单,如第一个答案中所述,或2个tr y将字段替换为表单。字段[街道]=选项\字段。首选的方法是1,其中可以将street字段重新定义为类属性。编辑:如果要缩小Street模型的数据库记录范围,请尝试重新定义字段的查询集,即form.fields[Street].queryset=Street.objects.filterpk\uu in=1,2
from django import forms
CHOICES = (("1", "First"), ("2", "Second"))
choice_field = forms.ChoiceField(widget=forms.Select, choices=CHOICES)
form.fields["street"].widget = choice_field