Почему мое поле ChoiceField не рендерится из формы Django в шаблон?

Я использую django forms и пытаюсь вывести имя объекта формы, хранящееся в словаре key, и соответствующее ему значение хранит form.ChoiceField для отображения на сайте. По какой-то причине он отображает только местоположение объекта в памяти, например <django.forms.fields.ChoiceField object at 0x04B304D8>, а не сам выпадающий список. Эти выпадающие поля представляют собой просто выбор от 0 до N, где N - количество товара, доступное в базе данных. not rendering the choicefield when retrieved from form field

Вот код моей формы

    name = forms.CharField(label="Employee Name", max_length = 200, required = False)
    jobsite = forms.CharField(label="Jobsite", max_length = 200, required = True)
    date_needed = forms.DateField(initial = now, required = True)
    SundryFields = {}
    def __init__(self, *args, **kwargs):
        sundries = kwargs.pop('sundries')
        super(CreateNewOrder, self).__init__(*args, **kwargs) # ? it works i guess ? 
        for sundry in sundries:
            quantity_list = [(i, i) for i in range(sundry.quantity_available + 1)]
            self.SundryFields[sundry.name] = forms.ChoiceField(choices=quantity_list)

Вот мой взгляд


```def orders(response):
    if response.method == "POST":
        form = CreateNewOrder(response.POST, sundries = Sundry.objects.all()) # holds information from form 
        if form.is_valid():

            cleaned_data = form.cleaned_data

            order = Order(name=cleaned_data["name"], jobsite=cleaned_data["jobsite"], date_needed=cleaned_data["date_needed"])
            order.save()
            # delete these from the order -- no longer needed once an order object is created 
            del cleaned_data["name"]
            del cleaned_data["jobsite"]
            del cleaned_data["date_needed"]

            # ROOM FOR OPTIMIZATION: filter data to only give list of objects that have a quantity requested with them
            def find_requested(cleaned_data):
                requested = []
                for name, value in cleaned_data.items():
                    if int(value) > 0:
                        requested.append(name)
                return requested

            # CREATE ALL ITEMS AND SAVE THEM TO THE ORDER
            for name in find_requested(cleaned_data):
                i = Item(order=order, text=name, quantity_requested=cleaned_data[name])
                i.save()
                # REMOVE FROM QUANTITY AVAILABLE IN SUNDRY MODEL
                Sundry.objects.filter(name=i.text).update(quantity_available = F('quantity_available') - i.quantity_requested)
            
            # HANDLE EMAILING HERE
            subject = 'QCE Warehouse - Order #' + str(order.pk)
            message = 'For: ' + order.name + "\n"
            for item in order.item_set.all():
                message += ("Item Requested: " + item.text + "Quantity: " + str(item.quantity_requested) + "\n")
            message += ("Date Needed: " + str(order.date_needed))
            email_from = settings.EMAIL_HOST_USER
            recipient_list = ['braxtonagoss@gmail.com']

            send_mail(subject, message, email_from, recipient_list)

            # SEND USER TO THANK YOU PAGE -- TODO: redirect to home after a few seconds
            return HttpResponseRedirect('thanks')

    else: 
        form = CreateNewOrder(sundries = Sundry.objects.all())

    return render(response, "main/order.html", {"sundryList": Sundry.objects.all, "form":form} )



Вот шаблон


{% block title %}Orders{% endblock %}


{% block content %}
    
    <h1>Current List of Available Sundries</h1> 

    <form method = "post" action="/orders/"> 
        {% csrf_token %}
        <div class="mb-3"> 
            <ul>
            Name: {{form.name}}
            Jobsite: {{form.jobsite}}
            Date Needed: {{form.date_needed}}
            </ul>
        </div>

        <ul> 
        {% for key, val in form.SundryFields.items %}
            <li> {{key}}, {{val}}  </li> 
        {% endfor %}
        </ul>

        <button type="submit", name="submit"> Submit Order </button>
    </form>
    

{% endblock %}

Если я правильно понял ваше требование, вам нужно отобразить поле <select> для каждого объекта Sundry в <ul>?

Я бы рекомендовал использовать поле <input type="number" />, если у вас есть широкий выбор / доступное количество для каждого из товаров.

Попробуйте следующее: Измените инициализацию вашей формы, чтобы сопоставить название белья и количество в наличии, как рассчитано, с парой ключ-значение:

name = forms.CharField(label="Employee Name", max_length = 200, required = False)
jobsite = forms.CharField(label="Jobsite", max_length = 200, required = True)
date_needed = forms.DateField(initial = now, required = True)
SundryFields = {}
  def __init__(self, *args, **kwargs):
      sundries = kwargs.pop('sundries')
      super(CreateNewOrder, self).__init__(*args, **kwargs) # ? it works i guess ? 
      for sundry in sundries:
         self.SundryFields[sundry.name] = sundry.quantity_available
<ul> 
  {% for key, val in form.SundryFields.items %}
    <li>
      {{key}}  # This will display the current SundryItem description
      <input type="number" min="0" max="{{val}}"/> # the max number allowed is the sundry.quantity_available for this instance as specified in the form __init__
    </li> 
  {% endfor %}
</ul>
Вернуться на верх