python - DoesNotExist at /cart/ OrderStatus 匹配查询不存在
问题描述
尽管在代码中进行了所有更正,但它表明 urls 路径和 views.py 代码不正确。
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from .import views
from django.contrib.auth import views as auth_views
from django.views.generic import RedirectView
urlpatterns = [
url(r"^admin/admin_update_quantities/$",
views.adminUploadQuantities, name="adminUploadQuantities"),
url(r"^accounts?/login/$", views.LoginView.as_view(),
name="account_login"),
url(r"^accounts?/signup/$", views.SignupView.as_view(),
name="account_signup"),
url(r"^accounts?/password_change", auth_views.PasswordChangeView.as_view(
template_name='account/password_change.html'),
name="password_change"),
url(r"^password_change_done", auth_views.PasswordChangeView.as_view(
template_name='account/password_change_done.html'),
name="password_change_done"),
url(r"^accounts?/", include("account.urls")),
url(r'^$', views.itemList, name='itemlist'),
url(r'^getitems$', views.getItems, name='getItems'),
url(r'^getitemarray$', views.getItemArray, name='getItemArray'),
url(r'^addtocart$', views.addToCart, name='addToCart'),
url(r'^setincart$', views.setInCart, name='setInCart'),
url(r'^getitemprices$', views.getItemPrices, name='getItemPrices'),
url(r'^getcartsum$', views.getCartSum, name='getCartSum'),
url(r'^getcart$', views.getCart, name='getCart'),
url(r'^getinvoicepdf$', views.getInvoicePdf, name='getInvoicePdf'),
url(r'^invoice/$', views.getInvoicePdf, name='getInvoicePdf'),
url(r'^getinvoice', views.getInvoice, name='getInvoice'),
url(r'^getdelivery', views.getDelivery, name='getDelivery'),
url(r'^gettotal', views.getTotal, name='getTotal'),
url(r'^getminordersum', views.getMinOrderSum, name='getMinOrderSum'),
url(r'^endoforder/', views.endOfOrder, name='endOfOrder'),
url(r'^myorders/', views.orderList, name='orderList'),
url(r'^cart/$', views.cart, name='cart'),
url(r'^item/(?P<itemSlug>\w+)', views.itemPage, name='item'),
url(r'^itemlist/$', views.itemList, name='itemlist'),
url(r'^itemlist/(?P<cls>\w+)', views.itemListSelection,
name='itemlistselection'),
url(r'^login/$', RedirectView.as_view(pattern_name='account/login')),
url(r'^order/$', views.makeOrder, name='order'),
url(r'^about/$', views.about, name='about')
]
下面的代码显示了包含购物车文件的 views.py 代码,如果需要,请在其中提出一些更正,它显示以下错误:DoesNotExist at /cart/OrderStatus 匹配查询不存在。
from .models import *
from django import template
from django.conf import settings
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User, Group
from django.core.validators import validate_email
from django.db.models import Q
from django.http import Http404
from django.shortcuts import render, get_object_or_404, HttpResponse, redirect
from django.template.loader import get_template
from django.utils import timezone
from django.core.mail import EmailMultiAlternatives
from django.contrib.sites.shortcuts import get_current_site
from io import BytesIO, StringIO
from django.core.mail import send_mail
from django.template.loader import render_to_string
from num2words import num2words
import json
import pdfkit
import shop.forms
import account.forms
import account.views
import xlrd
# methods returning JSON or string/int/decimal
def getItems(request):
if request.method == 'POST':
res = {}
for item in ProductVariant.objects.all():
obj = {}
obj['name'] = item.name
obj['slug'] = item.slug
obj['measure'] = item.product.measure
obj['quantity'] = item.quantity
obj['quality'] = item.quality
obj['multiplicity'] = item.multiplicity
res[item.slug] = obj
return HttpResponse(json.dumps(res))
return HttpResponse('error')
def getItemArray(request):
if request.method == 'POST':
res = []
for item in ProductVariant.objects.all():
res.append(item.slug)
return HttpResponse(json.dumps(res))
return HttpResponse('error')
def getItemPrices(request):
if request.method == 'POST':
res = {}
for item in ProductVariant.objects.all():
prices = {}
for price in item.price_set.all():
prices[int(price.quantity)] = float(price.price)
res[item.slug] = prices
return HttpResponse(json.dumps(res))
return HttpResponse('error')
def getItemStored(request):
if (request.method == 'POST'):
res = {}
for item in ProductVariant.objects.all():
res[item.slug] = item.quantity
return HttpResponse(json.dumps(res))
return HttpResponse('error')
def getCart(request):
res = {}
if request.method == 'POST':
if not request.user.is_authenticated:
return HttpResponse(json.dumps(res))
cart = Order.objects.get_or_create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)[0]
cart.delZeroes()
for item in cart.items.all():
res[item.product.slug] = item.quantity
return HttpResponse(json.dumps(res))
return HttpResponse('error')
def addToCart(request):
if request.method == 'POST':
if 'item' in request.POST \
and 'quantity' in request.POST \
and request.POST['quantity'].isdigit():
pItem = request.POST['item']
pQuantity = int(request.POST['quantity'])
if not request.user.is_authenticated:
return HttpResponse('not authenticated')
else:
cart = Order.objects.filter(
user=request.user, status=OrderStatus.objects.get(pk=1))
if len(cart) == 0:
cart = Order.objects.create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)
else:
cart = cart[0]
item = get_object_or_404(ProductVariant.objects, slug=pItem)
if (cart.getQuantity(item) + pQuantity) % item.multiplicity != 0:
return HttpResponse('must be divisible by multiplicity')
# if (item.quantity < cart.getQuantity(item) + pQuantity):
# return HttpResponse('stored quantity is too small')
cart.setQuantity(item, cart.getQuantity(item) + pQuantity)
cart.delZeroes()
return HttpResponse('ok')
else:
return HttpResponse('error')
else:
return HttpResponse('error')
def setInCart(request):
if request.method == 'POST':
if 'item' in request.POST \
and 'quantity' in request.POST \
and request.POST['quantity'].isdigit():
pItem = request.POST['item']
pQuantity = int(request.POST['quantity'])
if not request.user.is_authenticated:
return HttpResponse('not authenticated')
else:
cart = Order.objects.filter(
user=request.user, status=OrderStatus.objects.get(pk=1))
if len(cart) == 0:
cart = Order.objects.create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)
else:
cart = cart[0]
item = get_object_or_404(ProductVariant.objects, slug=pItem)
if pQuantity % item.multiplicity != 0:
return HttpResponse('must be divisible by multiplicity')
# if (item.quantity < pQuantity):
# return HttpResponse('stored quantity is too small')
cart.setQuantity(item, pQuantity)
cart.delZeroes()
return HttpResponse('ok')
else:
return HttpResponse('error')
else:
return HttpResponse('error')
def getCartSum(request):
if not request.user.is_authenticated:
return HttpResponse(0)
cart = Order.objects.filter(
user=request.user, status=OrderStatus.objects.get(pk=1))
if len(cart) == 0:
return HttpResponse(0)
cart = cart[0]
cart.delZeroes()
return HttpResponse(cart.getTotalSum())
def getDelivery(request):
if not request.user.is_authenticated:
return HttpResponse('0')
cart = Order.objects.get_or_create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)[0]
cart.delZeroes()
return HttpResponse(cart.getDelivery())
def getTotal(request):
if not request.user.is_authenticated:
return HttpResponse('0')
cart = Order.objects.get_or_create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)[0]
cart.delZeroes()
return HttpResponse(cart.getDelivery() + cart.getTotalSum())
def getStored(request):
pass
def getItemQuantityInCart(request):
if request.method == 'POST':
if 'item' in request.POST:
pItem = request.POST['item']
if not request.user.is_authenticated:
return HttpResponse('not authenticated')
else:
cart = Order.objects.filter(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)
if len(cart) == 0:
cart = Order.objects.create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)
else:
cart = cart[0]
cart.delZeroes()
item = get_object_or_404(ProductVariant.objects, slug=pItem)
return HttpResponse(cart.getQuantity(item))
else:
return HttpResponse('error')
else:
return HttpResponse('error')
def getMinOrderSum(request):
return HttpResponse(ShopConstant.getMinOrderSum())
# ----------- Views (HTML/PDF)
def orderList(request):
if not request.user.is_authenticated:
return redirect('/itemlist')
invoices = Invoice.objects.filter(
order__user=request.user).order_by('-date')
return render(request, 'shop/orderlist.html', {'invoices': invoices})
def getInvoicePdf(request):
invoice = get_object_or_404(Invoice.objects, pk=request.GET['pk'])
if request.user.is_superuser or request.user == invoice.order.user:
invoice_html = get_template('shop/invoice.html').render(
{
'invoice': invoice,
'sumInWords': num2words(invoice.toPay(),
lang='en-us',
to='currency',
currency='INR',
seperator=' ',
cents=False
).capitalize(),
})
pdf = pdfkit.from_string(invoice_html, False, options={'quiet': ''})
return HttpResponse(pdf, content_type='application/pdf')
return redirect('/')
# return HttpResponse('You have not access to this invoice')
def getInvoice(request):
invoice = get_object_or_404(Invoice.objects, pk=request.GET['pk'])
if request.user.is_superuser or request.user == invoice.order.user:
return render(request, 'shop/invoice.html',
{
'invoice': invoice,
'sumInWords': num2words(invoice.toPay(),
lang='en-us',
to='currency',
currency='INR',
seperator=' ',
cents=False
).capitalize(),
})
return redirect('/')
# return HttpResponse('You have not access to this invoice')
def cart(request):
if not request.user.is_authenticated:
return redirect('/itemlist')
cart = Order.objects.filter(
user=request.user, status=OrderStatus.objects.get(pk=1))
if len(cart) == 0:
cart = Order.objects.create(
user=request.user, status=OrderStatus.objects.get(pk=1))
else:
cart = cart[0]
cart.delZeroes()
return render(request, 'shop/cart.html',
{
'cart': cart,
'Delivery': Delivery.objects.all()
}
)
def makeOrder(request):
if not request.user.is_authenticated:
return redirect('/itemlist')
if request.method == 'GET':
cart = Order.objects.filter(
user=request.user, status=OrderStatus.objects.get(pk=1))
if len(cart) == 0:
cart = Order.objects.create(
user=request.user, status=OrderStatus.objects.get(pk=1))
else:
cart = cart[0]
cart.delZeroes()
if not cart.checkOrder():
return redirect('/order/')
# return HttpResponse('total sum is too low')
return render(request, 'shop/customerinfo.html',
{
'cart': cart,
'DADATA_API_KEY': settings.DADATA_API_KEY,
'total': (cart.getDelivery() + cart.getTotalSum())
}
)
inn = ''
kpp = ''
name = ''
address = ''
shipAddress = ''
comment = ''
face = ''
facePhone = ''
personRecipient = ''
personRecipientPhone = ''
try:
inn = request.POST['inn']
kpp = request.POST['kpp']
name = request.POST['name']
address = request.POST['address']
comment = request.POST['comments']
shipAddress = request.POST['shipping_address']
face = request.POST['face']
facePhone = request.POST['facePhone']
personRecipient = request.POST['personRecipient']
personRecipientPhone = request.POST['personRecipientPhone']
except:
cart = Order.objects.get_or_create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)[0]
return render(request, 'shop/customerinfo.html',
{
'cart': cart,
'errors': 'Error',
'DADATA_API_KEY': settings.DADATA_API_KEY
}
)
org = Organisation.objects.get_or_create(
inn=inn,
kpp=kpp,
address=address,
name=name
)[0]
cart = Order.objects.get_or_create(
user=request.user,
status=OrderStatus.objects.get(pk=1)
)[0]
cart.delZeroes()
if not cart.checkOrder():
return redirect('/order/')
# return HttpResponse('total sum is too low')
if request.user not in org.owners.all():
org.owners.add(request.user)
invoice = Invoice.objects.create(
date=timezone.now(),
seller=SellerOrganisation.objects.get(pk=1),
customer=org,
# order=cart,
personInCharge=face,
personInChargePhone=facePhone,
personRecipient=personRecipient,
personRecipientPhone=personRecipientPhone,
comment=comment,
shipAddress=shipAddress
)
cart.invoice = invoice
for item in cart.items.all():
item.product.quantity = item.product.quantity - item.quantity
item.product.save()
cart.activate()
invoice.recalc()
return redirect('/endoforder?pk=' + str(invoice.pk))
def itemList(request):
productClasses = ProductClass.objects.all()
return render(request, 'shop/itemList.html',
{
'productClasses': productClasses,
'cls': 'all',
'curitem': '',
})
def itemListSelection(request, cls):
productClasses = ProductClass.objects.all()
cls = str(cls)
if len(productClasses.filter(slug=cls)) == 0:
return redirect('/')
raise Http404('there are no such tag: ' + cls)
return render(request, 'shop/itemList.html',
{
'productClasses': productClasses,
'cls': cls,
'curitem': '',
})
def endOfOrder(request):
if not request.user.is_authenticated:
return redirect('/itemlist')
if 'pk' not in request.GET:
return HttpResponse('error')
pk = request.GET['pk']
_invoice = get_object_or_404(Invoice.objects, pk=request.GET['pk'])
if not _invoice.sent and (request.user.is_superuser or request.user == _invoice.order.user):
subject = render_to_string(
"shop/email/order_subject.txt",
{'current_site': get_current_site(request)}
)
subject = "".join(subject.splitlines())
message = render_to_string(
"shop/email/order.txt",
{'current_site': get_current_site(request)}
)
html_message = render_to_string(
"shop/email/order.html",
{'current_site': get_current_site(request)}
)
msg = EmailMultiAlternatives(
subject,
message,
settings.DEFAULT_FROM_EMAIL,
[request.user.email, ]
)
msg.attach_alternative(html_message, "text/html")
# msg.content_subtype = "html"
_invoice_html = get_template('shop/invoice.html').render(
{
'invoice': _invoice,
'sumInWords': num2words(_invoice.toPay(),
lang='en-us',
to='currency',
currency='INR',
seperator=' ',
cents=False
).capitalize()
})
_pdf = pdfkit.from_string(_invoice_html, False, options={'quiet': ''})
msg.attach('invoice.pdf', _pdf, 'application/pdf')
msg.send()
_invoice.sent = True
_invoice.save()
# else:
# return redirect('/')
# return HttpResponse('ERROR')
showNotification = False
#item = get_object_or_404(ProductVariant.objects, slug=pItem)
for item in _invoice.order.items.all():
if item.quantity > item.product.quantity:
showNotification = True
return render(request, 'shop/endoforder.html', {'pk': pk, 'notification': showNotification})
def itemPage(request, itemSlug):
item = get_object_or_404(Product.objects, slug=itemSlug)
if not item.available:
# HttpResponse('Product ' + item.slug + ' is not available now.')
return redirect('/')
productClasses = ProductClass.objects.all()
return render(request, 'shop/itemList.html',
{
'productClasses': productClasses,
'cls': 'all',
'curitem': itemSlug,
})
# return render(request, 'shop/itemPage.html', {'item': item})
def about(request):
return render(request, 'shop/about.html', {})
# auth
class LoginView(account.views.LoginView):
form_class = account.forms.LoginEmailForm
class SignupView(account.views.SignupView):
form_class = shop.forms.SignupForm
def generate_username(self, form):
username = form.cleaned_data["email"]
return username
def after_signup(self, form):
super(SignupView, self).after_signup(form)
# admin
def adminUploadQuantities(request):
if not request.user.is_superuser:
return HttpResponse('###')
if request.method == 'POST':
form = shop.forms.UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
updated, errors = updateQuantitiesXls(
'files/quantity/' + request.FILES['file'].name)
return render(request, 'admin/admin-update-quantities.html',
{
'updated': updated,
'errors': errors
}
)
else:
form = shop.forms.UploadFileForm()
return render(request, 'admin/admin-update-quantities.html',
{
'form': form
}
)
def handle_uploaded_file(f):
with open('files/quantity/' + f.name, 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
解决方案
推荐阅读
- admin-on-rest - (我可以)使用“admin-on-rest/lib/util/HttpError”中的“HttpError”是否安全?
- marklogic - 带有约束的 Marklogic 搜索语法语法
- javascript - 迭代一个数组数组以从另一个数组中匹配
- node.js - 为什么我的rest api post请求不能将我的数组保存在我的mongodb数据库中
- android - 如何将 SearchView 添加到我现有的“联系人”项目中?
- c# - 为什么这个弹出窗口认为它遇到了屏幕边缘?
- python - 从自定义模块中的导入模块禁用记录器
- ignition - 在 Ignition 中查找原始标签的 Max 和 Stdev
- python - 在“n”下面找到 3 或 5 的倍数
- spring - 'CommonDatabaseConfig' Spring Boot Batch XML 方法中的用户定义 bean 方法 'entityManagerFactory'