私はeコマースアプリに取り組んでおり、顧客がいくつかのアイテムを注文できるようにしたいと考えています。現在、彼らは1つしか注文できず、私はこれをどのように達成できるかを理解するのに苦労しています。私のメニューテンプレートでは、次のようにカテゴリ内のすべてのアイテムを返します。
{% for category in categories %}
<h5> {{ category.title }} </h5>
{% for item in category.item.all %}
<li><a href="{% url item_order item.id %}">{{item.name}}<span> {{item.price}}frw</span></li><a/>
OnClickでは、各アイテムが数量を注文できるフォームにリダイレクトされます。ここにビューがあります:
def show_item(request,id):
# need to evaluate the HTTP method
if request.method == 'POST':
a = Item.objects.get(pk=id)
form = forms.PartialOrderItemForm(request.POST,instance=a)
# check validation of posted data
if form.is_valid():
order.add_to_order(request)
# if test cookie worked, get rid of it
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
url =urlresolvers.reverse('order_index')
# redirect to order page
return HttpResponseRedirect(url)
else:
# it's a GET, create the unbound from. Note request as a Kwarg
form = forms.PartialOrderItemForm(request.GET)
# set the test cookie on our first GET request
request.session.set_test_cookie()
context={
# 'categories':categories,
'form':form,
# 'menu':menu,
}
return render_to_response('item.html',context,context_instance=RequestContext(request))
ある時点で、上記のビューは次のビューを呼び出します。つまり、フォームを検証した後です。order.add_to_order(request)
注文するアイテムを追加する
def add_to_order(request):
postdata = request.POST.copy()
# get item slug from post data, return blank if empty
# item_slug = postdata.get('item_slug','')
#get quantity added, return 0 if empty
quantity = postdata.get('quantity',0)
# fetch the item or return missing page error_message
i = get_object_or_404(Item,pk=1)
i.orderitem_set.all()
# get items in order
order_items = get_order_items(request)
item_in_orders = False
# check to see if item is already in order
for order_item in order_items:
if order_item.item.id == i.id:
#update the quantity if found
order_item.augment_quantity(quantity)
item_in_orders = True
if not item_in_orders:
# creat and save a new order item
oi = OrderItem()
oi.order_id = _order_id(request)
oi.quantity = quantity
oi.item = i
oi.save()
フォームが検証されると、注文が注文ページに表示されます。これがこれを行うビューです
def show_order(request):
if request.method == 'POST':
postdata = request.POST.copy()
if postdata['submit'] == 'Remove':
order.remove_from_order(request)
if postdata['submit'] == 'Update':
order.update_order(request)
order_items = order.get_order_items(request)
# page_title = 'F4L order'
order_subtotal = order.order_subtotal(request)
context = {
'order_items':order_items,
'order_subtotal':order_subtotal,
}
return render_to_response('public/order.html',context,context_instance=RequestContext(request))
こちらが注文ページのテンプレートの一部です。
<tbody>
{% if order_items %}
{% for item in order_items %}
<tr>
<td>
{{ item.item.name }}
</td>
<td>{{ item.item.price }}<span> frw</span></td>
<td class="right">
<form method="post" action="." class="order">
{% csrf_token %}
<label for="quantity">Quantity:</label>
<input type="text" name="quantity" value="{{ item.quantity }}" id="quantity" size="2" class="quantity" max_length="5" />
<input type="hidden" name="item_id" value="{{ item.id }}" />
</td>
<td>
<input type="submit" name="submit" value="Update" />
</form>
これが起こっていることです。最初のアイテムを注文するとpk=1
正しく機能しますが、2番目のアイテムなどを注文してフォームに入力すると、注文ページは常に最初のアイテムを返します。どのように私はこれについて行くべきだと思いますか。