2016-04-30 4 views
0

Ich arbeite an einem Django-Projekt, in dem ich ein Modell (Auftrag) habe, das verschiedene Bestellungen von Kunden enthält. Ich versuche, eines der Bestellfelder (Status) über die ID UpdateView (CancelOrder) zu aktualisieren. Ich habe die UpdateView geschrieben und die URLs.py geändert, aber wenn ich versuche, den Status einer Bestellung per URL zu aktualisieren, erhalte ich den Fehler: Es wurde keine Bestellung gefunden, die mit der Anfrage übereinstimmt, obwohl mehrere Bestellungen gespeichert wurden. Meine Frage ist, warum sieht das UpdateView meine Modelldaten nicht? Habe ich etwas verpasst?Warum sieht mein Django UpdateView meine Modelldaten (speziell die ID/PK) nicht?

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) 

Modell

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

Wie werden diese Ansicht/URL verwendet? Was passierst du in der POST? – AKS

+0

Muss das getan werden? In den Tutorials, die ich sah und las, schienen sie nur die updateview einzurichten, einige Zeilen zu urls.py hinzuzufügen und mit dem Browser zu interagieren (manuell type/cancel/id). Ich bin sicher, es gibt mehr praktische Möglichkeiten, dies zu tun, aber ich bin neu in Django. Was würdest du vorschlagen? – Codarus

+0

Welche Tutorials hast du gelesen? Könnten Sie einen Link angeben? – AKS

Antwort

0

in den Kommentaren der Suche und tun ein bisschen mehr Forschung realisierte ich, dass ich nicht ganz verstand, was ich zu tun versuchte; Am wichtigsten, ich hatte keine Vorlage. Ich habe das Problem wie folgt festgesetzt:

views.py

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

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

Vorlage. Ich habe das Problem wie folgt festgesetzt:

urls.py

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

urlpatterns = format_suffix_patterns(urlpatterns) 

Vorlage

{% 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 %} 

Helfer

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

Dies löst t er Problem, danke an alle in den Kommentaren.

Verwandte Themen