2016-04-30 194 views
0

我正在研究一个Django项目,其中我有一个模型(订单),其中包含从客户收到的各种订单。我试图通过使用UpdateView(CancelOrder)通过id更新一个Order字段(状态)。我写了UpdateView并修改了urls.py,但是当我尝试通过url更新订单的状态时,我得到错误:尽管存储了多个订单,但没有找到与查询匹配的订单。我的问题是,为什么UpdateView没有看到我的模型数据?我错过了什么吗?为什么我的Django UpdateView没有看到我的模型数据(特别是id/pk)?

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

如何使用此视图/网址?你在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 %} 

这解决了ŧ他发表了感谢大家的评论。

相关问题