【问题标题】:Django form class widget with drop down populated from database带有从数据库填充的下拉列表的 Django 表单类小部件
【发布时间】:2021-12-28 13:40:17
【问题描述】:

我正在使用 Django 3.2,我正在尝试创建一个表单类,其中包含从数据库模型填充的字段(类别)。

这是我的表单类的 sn-p:

class ArticleForm(forms.ModelForm):
    # ...
   
    class Meta:
        model = Article
        fields = ['title', 'teaser', 'category', 'guest_author','content', 'tags', 'is_published']
        categories = [] #forms.ModelChoiceField(queryset=ArticleCategory.objects.all().order_by('name'))

        widgets = {
            'guest_author': forms.TextInput(attrs={'class': 'form-control input'}),
            'title': forms.TextInput(attrs={'class': 'form-control input'}),
            'teaser': forms.Textarea(attrs={'class': 'form-control input'}),
            'category': forms.Select(choices=categories, attrs={'class': 'form-control input'}),
            'content': forms.Textarea(attrs={'class': 'form-control input'}),
            'tags': forms.TextInput(attrs={'class': 'form-control input'}),
            'is_published': forms.CheckboxInput(attrs={'class': 'form-control-input'})
        }

我发现我是否将字段创建为这样的实例属性:

category = forms.ModelChoiceField(queryset=ArticleCategory.objects.all().order_by('name'))

然后我就可以使用表单了(不会出现错误)。但是我希望能够使用上面的声明指定要用于该字段的小部件 - 无论如何都可以这样做 - 或者我是否仅限于将该字段声明为表单的实例变量?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    当您定义表单字段时,它们可以采用可选的widget 参数,因此您应该能够执行以下操作:

    category = forms.ModelChoiceField(queryset=ArticleCategory.objects.all().order_by('name'),
                           widget= the widget you want to use)
    

    【讨论】:

    • 我正在使用的小部件声明如下:forms.Select(choices=categories, attrs={'class': 'form-control input'}), 我将什么作为第一个参数(而不是choices)传递给form.Select()
    • 似乎(从文档中默认小部件是Select,看起来我也不需要指定choices。我会试一试,如果它有效,我'会接受你的回答。
    • 是的,ModelChoiceField 的默认小部件是 Select 小部件。
    • @HomunculusReticulli 这对你有用吗?
    猜你喜欢
    • 2020-06-23
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多