Получение ошибки im Django «Значение исключения:имя ‘order_id’ не определено» Запрос whne с целью перечисления дочерних записей

#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 с помощью функции печати? Я был бы признателен, если бы вы могли поделиться результатами здесь.