Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Modelforms:如何显示字符域的select?_Django_Django Forms_Modelform - Fatal编程技术网

Django Modelforms:如何显示字符域的select?

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

我正在Django中使用ModelForms创建表单。这很有效。然而,数据库中有一个字段是charfield,但是对于一个特定的表单,我想将用户可以输入的选项限制为一个特定项的列表——理想情况下,显示在一个列表中。这样做的正确方式是什么?这是我的密码:

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