2016-04-30 5 views
0

私は、顧客から受け取ったさまざまな注文を保持するモデル(注文)を持っているDjangoプロジェクトに取り組んでいます。 UpdateView(CancelOrder)を使用して、Orderフィールド(ステータス)の1つをID経由で更新しようとしています。私はUpdateViewを書いてurls.pyを修正しましたが、urlを使って注文のステータスを更新しようとするとエラーが表示されます:複数の注文が保存されているにもかかわらず、私の質問は、なぜUpdateViewは私のモデルデータを見ていないのですか?私は何かを逃したか?私のモデルデータ(特にid/pk)が私のDjango UpdateViewに表示されないのはなぜですか?

Views.py

from django.shortcuts import render, redirect, HttpResponse 
from django.core.exceptions import * 
from django.views.generic.edit import UpdateView 

from menu.models import Item, Order, Customer 
from menu.forms import OrderForm, CustForm, UpdateForm 
from .serializers import ItemSerializer 
from rest_framework import generics 

class CancelOrder(UpdateView): 
    model = Order 
    field = ('status',) 

urls.py

from django.conf.urls import url, patterns, include 
from . import views 
from rest_framework.urlpatterns import format_suffix_patterns 

urlpatterns = patterns('', 
    url(r'^$', views.CreateOrder, name='CreateOrder'), 
    url(r'^vieworder/', views.ViewOrder, name='ViewOrder'), 
    url(r'^confirmation/', views.ConfirmOrder, name='ConfirmOrder'), 
    url(r'^api/$', views.ItemList.as_view()), 
    url(r'^api/(?P<pk>[0-9]+)/$', views.ItemDetail.as_view()), 
    url(r'^cancel/(?P<pk>[0-9]+)/$', views.CancelOrder.as_view(), name='CancelOrder'), 
) 

urlpatterns = format_suffix_patterns(urlpatterns) 

モデル

class Order(models.Model): 

    order_date = models.DateField(default=timezone.now) 
    delivery_date = models.DateField(default=timezone.now) 
    status = models.CharField(max_length=10, default='open') 
    ordered_by = models.CharField(max_length=50, null=True) 

    #user input 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 
    phone = models.CharField(max_length=50) 
    shipping_info = models.CharField(max_length=50, null=True) 
    billing_info = models.CharField(max_length=50, null=True) 
    notes = models.CharField(max_length=150) 
    total = models.DecimalField(default=0, max_digits=5, decimal_places=2) 
    surcharge = models.DecimalField(default=0, max_digits=5,decimal_places=2) 

    def __str__(self): 
     return self.name 
+0

どのようにこのビュー/ URLを使用していますか?あなたは何をPOSTで渡していますか? – AKS

+0

それは何をする必要がありますか?私が見たチュートリアルでは、単にupdateviewを設定し、urls.pyにいくつかの行を追加し、ブラウザと対話していました(手動で/ cancel/idをタイプする)。これを行うもっと実用的な方法があると確信していますが、私はDjangoを初めて使っています。何をお勧めしますか? – Codarus

+0

あなたはどのチュートリアルを読みましたか?あなたはリンクを提供できますか? – AKS

答えて

0

コメントを見るとやって私が何をしようとしているかを完全には理解していないことがわかった。最も重要なのは私はテンプレートを持っていなかったということです。次のように私は問題を修正しました:

views.py

class CancelOrder(UpdateView): 
model = Order 
fields = ('status',) 
template_name = 'menu/order_form.html' 

def get_success_url(self): 
    return reverse('confirm') 

テンプレート。次のように私は問題を修正しました:

urls.py

urlpatterns = patterns('', 
... 
url(r'^updateorder/(?P<pk>[0-9]+)/$', views.CancelOrder.as_view(), name='cancel') 
) 

urlpatterns = format_suffix_patterns(urlpatterns) 

テンプレート

{% extends "menu/header.html" %} 

{% block content %} 

<form method="POST" action="">{% csrf_token %} 
<div id='helper'>{% include 'menu/includes/helper.html' %}<div> 
<input id="submit" type="submit" value="Cancel Order"> 
</form> 
<p>*Type "cancelled" to cancel your order</p> 

{% endblock %} 

ヘルパー

{% for field in form %} 
<div> 
<div><span>{{field.errors}}</div></span> 
<label>{{field.label_tag}}</label> 
<div>{{field}}</div> 
<div> 
{% endfor %} 

これはトンを解決します彼はコメントの誰もが感謝します。

関連する問題