Создание выпадающего списка из модели в Django

#python #html #django #drop-down-menu #dropdown

#python #HTML #django #выпадающее меню #выпадающий

Вопрос:

Я хочу создать выпадающий список в шаблоне, где значения выпадающего списка берутся из поля (ссылки) в моей модели заказов в models.py . Я понимаю, что создание выпадающего списка, в котором значения задаются статически, но поскольку я хочу заполнить значения, хранящиеся в БД, я не уверен, с чего начать.

Я создал модель и попытался поиграть с views.py , forms.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:

Используете ли вы Materialize CSS? Если да, то Django forms отображает выпадающие списки иначе, чем ожидает 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. Вы также можете передавать любые теги имен в атрибутах.

Проблема:https://github.com/Dogfalo/materialize/issues/4904