【问题标题】:Django ChoiceField populated from database values从数据库值填充的 Django ChoiceField
【发布时间】:2012-08-13 14:34:48
【问题描述】:

我在使用 ChoiceField 在数据库中创建值的下拉列表时遇到问题。这是代码的sn-p

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'

有什么想法吗?

【问题讨论】:

    标签: django choicefield


    【解决方案1】:

    ChoiceField 没有查询集。你正在寻找ModelChoiceField

    【讨论】:

    • 太棒了——这很好。我在下拉框中得到一个 ------ 作为默认值。我可以改变它吗?谢谢!
    • 如果该字段是可选的,如果显示该字段,请将表单上的字段设置为required=True以将其删除。
    【解决方案2】:

    如果您想从数据库中填充下拉列表,我建议您将单个对象中的所有值从 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 循环中遍历 objectlist。

    <select>
    
    
    {% for element in objectlist %}
    
    
    <option value={{ element.id }}>{{ element.name }}
    
    
    
         </select>
    

    选项标签中的值取决于您需要在 API 中处理的内容

    【讨论】:

      【解决方案3】:

      使用 ModelChoiceField Link Here

      ChoiceField 不支持查询集

      【讨论】:

      • 谢谢 - 明白了.. 我想我可以使用初始值,所以我看不到 ------ 出现?
      • @Oli 可以用初始值去掉----set initial = "Some value"
      【解决方案4】:

      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})
      

      客户.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>
      

      输出

      【讨论】:

      • 嗨,泰语,围绕您的解决方案添加更多解释,而不仅仅是发布代码,这将是一个很好的回应。
      【解决方案5】:

      在 Django 2+ 中,您可以使用“选择”而不是“查询集”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2014-05-27
        • 2022-01-01
        • 1970-01-01
        • 2016-01-01
        • 2021-02-01
        相关资源
        最近更新 更多