在Django中从模型创建下拉列表

时间:2019-04-25 01:41:14

标签: python html django drop-down-menu dropdown

我正在寻找在模板中创建一个下拉菜单,其中该下拉菜单的值来自models.py中我的Orders模型中的字段(引用)。我知道会创建一个下拉列表,其中的值是静态设置的,但是由于我要填充数据库中存储的值,因此我不确定从哪里开始。

我已经创建了模型,并尝试使用views.pyforms.py和模板。我能够显示每个订单号,但没有显示在下拉列表中,而且我还在为如何编写模板而苦苦挣扎。

models.py

from django.db import models

class Orders(models.Model): 

    reference = models.CharField(max_length=50, blank=False)
    ultimate_consignee = models.CharField(max_length=500)
    ship_to = models.CharField(max_length=500)

def _str_(self):
    return self.reference

forms.py

from django import forms
from .models import *

def references():
    list_of_references = []
    querySet = Orders.objects.all()
    for orders in querySet:
        list_of_references.append(orders.reference)
    return list_of_references

    class DropDownMenuReferences(forms.Form):

        reference = forms.ChoiceField(choices=[(x) for x in references()])

views.py

def reference_view(request):
    if request.method == "POST":
        form = references(request.POST)

        if form.is_valid():
            form.save()
            return redirect('index')

    else:
        form = references()
        return render(request, 'proforma_select.html', {'form': form})

proforma_select.html

{% extends 'base.html' %}

{% block body %}

  <div class="container">
    <form method="POST">

      <br>

      {% for field in form %}
      <div class="form-group row">
        <label for="id_{{ field.name }}" class="col-2 col-form-label"> {{ field.label }}</label>
        <div class="col-10">
          {{ field }}

        </div>
      </div>
      {% endfor %}

      <button type="submit" class="btn btn-primary" name="button">Add Order</button>
    </form>
  </div>

{% endblock %}

渲染模板时得到的所有内容都是列出的每个参考编号,但不在下拉列表中。这使我相信我的问题主要出在模板上,但是我不确定是我刚接触Django。

1 个答案:

答案 0 :(得分:0)

您是否正在使用Materialize CSS?如果是,则Django表单呈现的下拉菜单与Materialize期望的不同。因此,您将要覆盖表单窗口小部件。您可以这样做:

forms.py:

class DropDownMenuReferences(forms.Form):
     reference = forms.ChoiceField(choices=[(x) for x in references()],
     widget=forms.Select(choices=[(x) for x in references()], attrs={'class': 
     'browser-default'}))

这将覆盖传递到html中的参数。您也可以在attrs中传递任何名称标签。

问题: https://github.com/Dogfalo/materialize/issues/4904