Почему мое поле ChoiceField не рендерится из формы Django в шаблон?
Я использую django forms и пытаюсь вывести имя объекта формы, хранящееся в словаре key, и соответствующее ему значение хранит form.ChoiceField для отображения на сайте. По какой-то причине он отображает только местоположение объекта в памяти, например <django.forms.fields.ChoiceField object at 0x04B304D8>, а не сам выпадающий список. Эти выпадающие поля представляют собой просто выбор от 0 до N, где N - количество товара, доступное в базе данных.
Вот код моей формы
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>