【问题标题】:Django items = order.orderitem_set.all() returning empty value for quantityDjango items = order.orderitem_set.all() 返回数量的空值
【发布时间】:2020-10-24 22:42:09
【问题描述】:

当我尝试将 {{ item.product.quantity }} 放入其中时,它会返回一个空值。数量值填入数据库。我似乎无法确定问题所在。我已经尝试打印数量值但得到相同的结果。

cart.html

{% extends 'store/main.html' %}
{% load static %}
{% block content %}
     <div class="row">
        <div class="col-lg-12">
            <div class="box-element">
                <a  class="btn btn-outline-dark" href="{% url 'store' %}">&#x2190; Continue Shopping</a>
                <br>
                <br>
                <table class="table">
                    <tr>
                        <th><h5>Items: <strong>3</strong></h5></th>
                        <th><h5>Total:<strong> $42</strong></h5></th>
                        <th>
                            <a  style="float:right; margin:5px;" class="btn btn-success" href="{% url 'checkout' %}">Checkout</a>
                        </th>
                    </tr>
                </table>
            </div>

            <br>

            <div class="box-element">
                <div class="cart-row">
                    <div style="flex:2"></div>
                    <div style="flex:2"><strong>Item</strong></div>
                    <div style="flex:1"><strong>Price</strong></div>
                    <div style="flex:1"><strong>Quantity</strong></div>
                    <div style="flex:1"><strong>Total</strong></div>
                </div>
                {% for item in items %}
                    <div class="cart-row">
                        <div style="flex:2"><img class="row-image" src="{{ item.product.imageURL }}"></div>
                        <div style="flex:2"><p>{{ item.product.name }}</p></div>
                        <div style="flex:1"><p>R{{ item.product.price|floatformat:2 }}</p></div>
                        <div style="flex:1">
                            <p class="quantity">{{ item.product.quantity }}</p>
                            <div class="quantity">
                                <img class="chg-quantity" src="{% static  'images/arrow-up.png' %}">

                                <img class="chg-quantity" src="{% static  'images/arrow-down.png' %}">
                            </div>
                        </div>
                        <div style="flex:1"><p>$32</p></div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>
{% endblock content %}

views.py

from django.shortcuts import render
from .models import *

def store(request):
    search = request.GET.get('search')
    products = Product.objects.all()

    if search != '' and search is not None:
        products = products.filter(name__icontains=search)

    context= {'products': products}
    return render(request, 'store/store.html', context)


def cart(request):
    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
    else:
        items = []

    context= {'items': items}
    return render(request, 'store/cart.html', context)

def checkout(request):
    context= {}
    return render(request, 'store/checkout.html', context)

models.py

from django.db import models
from django.contrib.auth.models import User


class Customer(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    price = models.FloatField()
    digital = models.BooleanField(default=False, null=True, blank=True)
    image = models.ImageField(null=True, blank=True)

    def __str__(self):
        return self.name

    @property
    def imageURL(self):
        try:
            url = self.image.url
        except:
            url = ''
        return url


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, null=True, blank=False)
    transaction_id = models.CharField(max_length=100, null=True)

    def __str__(self):
        return str(self.id)

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)


class ShippingAddress(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
    address = models.CharField(max_length=200, null=False)
    city = models.CharField(max_length=200, null=False)
    state = models.CharField(max_length=200, null=False)
    zipcode = models.CharField(max_length=200, null=False)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.address

如果我这样做print(items)

, ]>

【问题讨论】:

    标签: python python-3.x django django-models django-views


    【解决方案1】:

    所以quantity 是模型OrderItem 的一个字段。

    您对返回的items 对象的查询是:

    order, created = Order.objects.get_or_create(customer=customer, complete=False)
    

    Order 是:

    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, null=True, blank=False)
        transaction_id = models.CharField(max_length=100, null=True)
    
        def __str__(self):
            return str(self.id)
    

    quantity

    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)
    

    所以你返回的对象不包含

    {{ item.product.quantity }}
    

    所以你必须使用(感谢您强调它@Jakumi

    {{ item.quantity }}
    

    【讨论】:

    • 如果是这样,为什么 {{ item.product.name }} 和 {{ item.product.price|floatformat:2 }} 仍然返回值
    • 因为它们是您的Product 模型的一部分,但数量不是
    • @Connor 要么更改模板标签(参见答案),要么更改模型关系的逻辑。什么最适合你。如果{{ item.orderitem.quantity }} 不起作用,请发布您返回的对象,以便我弄清楚(打印(项目))
    • 放入 {{ item.orderitem.quantity }} 不起作用
    • @Jonas:在 OP 的情况下只是 {{ item.quantity }}
    猜你喜欢
    • 2016-06-29
    • 2019-01-19
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多