从数据库值填充Django ChoiceField

18

我在使用ChoiceField创建一个数据库值下拉列表时遇到了问题。这是代码片段:

from django import forms
from testplatform.models import ServiceOffering

class ContactForm(forms.Form):

    subject = forms.ChoiceField(queryset=ServiceOffering.objects.all())
    #subject = forms.ModelMultipleChoiceField(queryset=ServiceOffering.objects.all())

使用 #subject.... 行代码可以正常工作,但是当我使用 ChoiceField(queryset....) 时,会出现以下错误。

__init__() got an unexpected keyword argument 'queryset'

有什么想法吗?

5个回答

38

ChoiceField 没有查询集。您需要使用 ModelChoiceField


太好了 - 这个方法很有效。我在下拉框中得到一个------作为默认值。我能改变它吗?谢谢! - Oli
2
如果字段是可选的,可以将表单上的该字段设置为required=True以删除它。 - Chris Pratt

7

如果你想从数据库中填充下拉列表,我建议你将所有的值从views.py传递到模板中。你可以这样做: 1] 从数据库中提取所有的值:

objectlist = ModelName.objects.all()

如果你想在下拉列表中按顺序显示列表,可以这样做:
objectlist = ModelName.objects.all().order_by('fieldname')

如果您想要获取不同的列表,请执行以下操作:

objectlist = ModelName.objects.distinct('fieldname')

2] 使用模板渲染此“objectlist”

return render(request, 'template.html', {'objectlist': objectlist})

3] 在模板中使用select标签,并在用户for循环中迭代对象列表。

<select>


{% for element in objectlist %}


<option value={{ element.id }}>{{ element.name }}



     </select>

3

请使用ModelChoiceField 链接在这里

ChoiceField 不支持 queryset。


谢谢,我明白了。我想我可以使用初始值,这样我就看不到“------”出现了? - Oli
@Oli 是的,你可以使用初始值来摆脱 ---- 设置初始值 =“某个值” - Jubin Thomas

1

view.py:- 这是我的view.py文件。以下是创建的代码。

def add_customer(request):
    objectlist = Vehicle.objects.values('brand_name').distinct().order_by('brand_name')
    if request.method == 'POST':
        form = CustomerForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/show-customers')
    else:
        form = CustomerForm()
    return render(request, 'add-customer.html', {'form':form, 'objectlist':objectlist})

Customer.html

<select name="prefer_car_model" id="id_prefer_car_model" required>
                <option value="0" selected disabled> Select Car model </option>
                {% for obj in objectlist %}
                <option value="{{ obj.brand_name }}">{{ obj.brand_name }} </option>
                {% endfor %}
            </select>

输出

VMS - Vehicle Brand Name Lists


嗨,Thai,如果你能在解决方案中添加更多的解释,而不仅仅是发布代码,那将会是一个很棒的回答。 - Ian

0
在Django 2+中,您可以使用“choices”代替“queryset”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接