【发布时间】:2021-09-08 19:21:35
【问题描述】:
我正在使用 django 表单并尝试呈现存储在字典键中的表单对象的名称,其对应的值存储一个 form.ChoiceField 以显示在网站上。出于某种原因,它仅显示内存中的对象位置,例如
这是我的表单代码
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 %}
【问题讨论】:
-
在订单函数的else语句中,为什么
form = CreateNewOrder(sundries = Sundry.objects.all())的那一行? -
@FaisalNazik 因为我需要根据 **kwargs 中的杂项创建表单变量,所以我尝试将其删除并在 init 函数尝试获取时得到一个 imeediate keyError '杂货'。
-
你想用这些
sundryFields实现什么? -
@WillemVanOnsem 我需要向用户显示的名称和下拉/输入框,以允许用户提交选择了这些数量的订单。
标签: python django django-forms