#python #python-3.x #django
Вопрос:
Получение ошибки im Django «Значение исключения:имя ‘order_id’ не определено» Запрос whne с целью перечисления дочерних записей
Я создаю настраиваемое представление корзины, которое можно редактировать, где я все еще могу добавлять/обновлять элементы заказов. Проблема в том, что в представлении отображаются все элементы заказа из всех заказов. Независимо от того, как я пытаюсь отфильтровать результаты, я получаю ошибку «имя «xxxxxxx» не определено
Представление работает, но содержит список всех дочерних записей
Я не могу отформатировать это ввиду
def get_context_data(self, **kwargs): # used to send additional context
context = super().get_context_data(**kwargs)
context["title"] = 'Edit Sizing'
context["savebtn"] = 'Update Sizing'
context["delbtn"] = 'Delete Sizing'
# data = cartData(request)
# cartItems = data['cartItems']
**items = OrderItem.objects.filter(orderitem__in=order_id)**
# items = OrderItem.objects.filter(order=order)
orders = Order.objects.filter(orderitem__in=items)
# items = OrderItem.objects.all()
context = {'items': items, 'orders': orders}
return context
Error in Browser
NameError at /sizing/1/edit
name 'order_id' is not defined
Request Method: GET
Request URL: http://127.0.0.1:8000/sizing/1/edit
Django Version: 3.2.4
Exception Type: NameError
Exception Value:
name 'order_id' is not defined
Exception Location: C:UsersLSsourcereposesstools17esstoolsstoreviews.py, line 58, in get_context_data
Python Executable: C:UsersLSsourcereposesstools17envScriptspython.exe
Python Version: 3.9.3
Python Path:
['C:\Users\LS\source\repos\esstools17\esstools',
'c:\python39\python39.zip',
'c:\python39\DLLs',
'c:\python39\lib',
'c:\python39',
'C:\Users\LS\source\repos\esstools17\env',
'C:\Users\LS\source\repos\esstools17\env\lib\site-packages']
Server time: Thu, 22 Jul 2021 23:41:03 0000
Traceback Switch to copy-and-paste view
Models.py
class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True)
date_ordered = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=100, null=True)
prepareded_by = models.CharField(max_length=75, blank=True, null=True)
status = models.CharField(max_length=75, blank=True, null=True)
date_modify = models.DateTimeField(auto_now=True)
valid_until = models.DateTimeField(blank=True, null=True)
acct_name = models.CharField(max_length=75, blank=True, null=True)
product = models.CharField(max_length=75, blank=True, null=True)
regions = models.CharField(max_length=75, blank=True, null=True)
salescon_num = models.CharField( max_length=75, blank=True, null=True)
RFS_Num= models.CharField(max_length=75, blank=True, null=True)
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
Views.py
from django.shortcuts import render, redirect
from django.db.models import Q
from django.http import JsonResponse
import json
import datetime
from rest_framework import viewsets
from django.http.response import HttpResponse
from django.views import generic
from .models import Order, OrderItem, Product, ProdCategory, ProdVendor, AvProduct, Sla, Sizing, Album
from .serializers import OrderSerializer, SlaSerializer, AlbumSerializer
from .forms import OrderForm
from django.views.generic import (
ListView,
View,
CreateView,
UpdateView
)
from django_filters.views import FilterView
from .filters import OrderFilter
from django.contrib.messages.views import SuccessMessageMixin
from .utils import cookieCart, cartData, cartData2, guestOrder
class OrderListView(FilterView):
filterset_class = OrderFilter
queryset = Order.objects.filter()
template_name = 'store/sizing.html'
paginate_by = 10
def sizer(request):
data = cartData(request)
cartItems = data['cartItems']
order = data['order']
items = data['items']
context = {'items':items, 'order':order, 'cartItems':cartItems}
return render(request, 'store/sizer.html', context)
class OrderUpdateView(SuccessMessageMixin, UpdateView): # updateview class to edit sizing, mixin used to display message
model = Order # setting 'Sizing' model as model
form_class = OrderForm # setting 'SizingForm' form as form
template_name = "store/edit_sizing.html" # 'edit_sizing.html' used as the template
success_url = '/sizing' # redirects to 'sizing' page in the url after submitting the form
success_message = "Sizing has been updated successfully" # displays message when form is submitted
def get_context_data(self, **kwargs): # used to send additional context
context = super().get_context_data(**kwargs)
context["title"] = 'Edit Sizing'
context["savebtn"] = 'Update Sizing'
context["delbtn"] = 'Delete Sizing'
# data = cartData(request)
# cartItems = data['cartItems']
items = OrderItem.objects.filter(orderitem__in=order_id)
# items = OrderItem.objects.filter(order=order)
orders = Order.objects.filter(orderitem__in=items)
# items = OrderItem.objects.all()
context = {'items': items, 'orders': orders}
return context
class OrderDeleteView(View): # view class to delete sizing
template_name = "delete_sizing.html" # 'delete_sizing.html' used as the template
success_message = "Sizing has been deleted successfully" # displays message when form is submitted
def get(self, request, pk):
order = get_object_or_404(Order, pk=pk)
return render(request, self.template_name, {'object': order})
def post(self, request, pk):
order = get_object_or_404(Order, pk=pk)
order.is_deleted = True
order.save()
messages.success(request, self.success_message)
return redirect('sizing')
# class OrderItemListView(generic.ListView):
# model = OrderItem
# context_object_name = 'orderitem_list' # your own name for the list as a template variable
# queryset = OrderItem.objects.filter(order_id__icontains='war')[:5] # Get 5 books containing the title war
# template_name = 'store/edit_sizing.html' # Specify your own template name/location
def store(request):
#form = OrderForm()
#if request.method == 'Post':
# form = OrderForm(request.Post)
# if form.is_valid():
# form.save()
#context = {'form':form}
data = cartData(request)
cartItems = data['cartItems']
order = data['order']
items = data['items']
products = Product.objects.all()
context = {'products':products, 'cartItems':cartItems}
return render(request, 'store/store.html', context)
##Added as a updated feature
def dashboard(request):
#form = OrderForm()
#if request.method == 'Post':
# form = OrderForm(request.Post)
# if form.is_valid():
# form.save()
#context = {'form':form}
data = cartData(request)
cartItems = data['cartItems']
order = data['order']
items = data['items']
products = Product.objects.all()
context = {'products':products, 'cartItems':cartItems}
return render(request, 'store/dashboard.html', context)
def cart(request):
data = cartData(request)
cartItems = data['cartItems']
order = data['order']
items = data['items']
context = {'items':items, 'order':order, 'cartItems':cartItems}
return render(request, 'store/cart.html', context)
def sizer(request):
data = cartData(request)
cartItems = data['cartItems']
order = data['order']
items = data['items']
context = {'items':items, 'order':order, 'cartItems':cartItems}
return render(request, 'store/sizer.html', context)
def createsizerview(request):
# dictionary for initial data with
# field names as keys
context ={}
# add the dictionary during initialization
form = OrderForm(request.POST or None)
if form.is_valid():
form.save()
context['form']= form
return render(request, "store/createsizerview.html", context)
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all().order_by('transaction_id')
serializer_class = OrderSerializer
def checkout(request):
data = cartData(request)
cartItems = data['cartItems']
order = data['order']
items = data['items']
context = {'items':items, 'order':order, 'cartItems':cartItems}
return render(request, 'store/checkout.html', context)
def updateItem(request):
data = json.loads(request.body)
productId = data['productId']
action = data['action']
print('Action:', action)
print('Product:', productId)
customer = request.user.customer
product = Product.objects.get(id=productId)
order, created = Order.objects.get_or_create(customer=customer, complete=False)
orderItem, created = OrderItem.objects.get_or_create(order=order, product=product)
if action == 'add':
orderItem.quantity = (orderItem.quantity 1)
elif action == 'remove':
orderItem.quantity = (orderItem.quantity - 1)
orderItem.save()
if orderItem.quantity <= 0:
orderItem.delete()
return JsonResponse('Item was added', safe=False)
def processOrder(request):
transaction_id = datetime.datetime.now().timestamp()
data = json.loads(request.body)
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
else:
customer, order = guestOrder(request, data)
total = float(data['form']['total'])
order.transaction_id = transaction_id
if total == order.get_cart_total:
order.complete = True
order.save()
if order.shipping == True:
ShippingAddress.objects.create(
customer=customer,
order=order,
address=data['shipping']['address'],
city=data['shipping']['city'],
state=data['shipping']['state'],
zipcode=data['shipping']['zipcode'],
)
return JsonResponse('Payment submitted..', safe=False)
#****** DataTables Views *******
class SlaViewSet(viewsets.ModelViewSet):
queryset = Sla.objects.all()
serializer_class = SlaSerializer
def list(self, request, **kwargs):
try:
sla = query_sla_by_args(**request.query_params)
serializer = SlasSerializer(sla['items'], many=True)
result = dict()
result['data'] = serializer.data
result['draw'] = sla['draw']
result['recordsTotal'] = sla['total']
result['recordsFiltered'] = sla['count']
return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)
except Exception as e:
return Response(e, status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)
Комментарии:
1. Я получаю одну и ту же ошибку независимо от того, какое значение я добавляю в…., items = OrderItem.objects.filter(orderitem__in=order_id)
2. Приведенный ниже код работает, но возвращает все элементы заказа, где мне нужны только элементы заказа, связанные с «Заказом»…., items = OrderItem.objects.all()
Ответ №1:
Я предполагаю, что вы не определили order_id
переменную. Или я этого не видел.
items = OrderItem.objects.filter(orderitem__in=order_id)
Комментарии:
1.Я внес несколько изменений, но все еще не получаю их…., ошибка просто изменяется, чтобы включить любое поле или переменную, которые я добавляю. Я уверен, что это мое недопонимание # данные = Данные корзины(запрос) # cartItems = данные[‘cartItems’] order_id = целях.код детали = OrderItem.объекты.фильтр(order_id=order_id) # изделия = OrderItem.объекты.фильтр(приказ=распоряжение) заказы = целях.объекты.фильтр(orderitem__в=элементы) # изделия = OrderItem.объекты.все() контекст = {‘товары’: детали, приказов: приказы} вернуть контексте
2. Ошибка ввода в /размер/1/Поле редактирования «идентификатор» ожидал номер, но получил query_utils. Объект атрибута DeferredAttribute в 0x000002761FD5CA60>. Метод запроса: ПОЛУЧИТЬ URL-адрес запроса: 127.0.0.1:8081/размер/1/редактирование Версия Django: 3.2.4 Тип исключения: Ошибка типа Значение исключения: Поле «идентификатор» ожидалось число, но получено query_utils. Объект атрибута DeferredAttribute по адресу 0x000002761FD5CA60>.>
3. Так откуда же взялся этот Приказ? Можете ли вы проверить значения
Order
иOrder.id
с помощью функции печати? Я был бы признателен, если бы вы могли поделиться результатами здесь.