微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django Modelforms:如何显示CharField的选择?

如何解决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 举报,一经查实,本站将立刻删除。