2016-04-30 1 views
0

Я работаю над проектом Django, в котором у меня есть модель (заказ), которая содержит различные заказы, полученные от клиентов. Я пытаюсь обновить один из полей Order (статус) с помощью id с помощью UpdateView (CancelOrder). Я написал 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

Как использовать это представление/url? Что вы передаете в ПОСТ? – 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 %} 

Это решает т он выдает, спасибо всем в комментариях.