我的应用程序中有多种型号。但是,有一个我无法注册,因此可以在admin panel
中看到它。
因此,在我的cart
应用admin.py
文件中,我可以使用:
from django.contrib import admin
from .models import Cart, CartItem
# Register your models here.
admin.site.register(Cart)
但不是:
from django.contrib import admin
from .models import Cart, CartItem
# Register your models here.
admin.site.register(Cart, CartItem)
因为出现此错误:
File "/home/ogonzales/Escritorio/projects_envs/perfectcushion_env/lib/python3.6/site-packages/django/contrib/admin/checks.py", line 26, in check_admin_app
errors.extend(site.check(app_configs))
File "/home/ogonzales/Escritorio/projects_envs/perfectcushion_env/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 81, in check
if modeladmin.model._meta.app_config in app_configs:
AttributeError: 'CartItem' object has no attribute 'model'
购物车/模型.py :
from django.db import models
from shop.models import Product
# Create your models here.
class Cart(models.Model):
cart_id = models.CharField(max_length=250, blank=True)
date_added = models.DateField(auto_now_add=True)
class Meta:
db_table = 'Cart'
ordering = ['date_added']
def __str__(self):
return self.cart_id
class CartItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
quantity = models.IntegerField()
active = models.BooleanField(default=True)
class Meta:
db_table = 'CartItem'
def sub_total(self):
return self.product.price * self.quantity
def __str__(self):
return self.product
购物车/views.py:
from django.shortcuts import render, redirect, get_object_or_404
from shop.models import Product
from .models import Cart, CartItem
from django.core.exceptions import ObjectDoesNotExist
import stripe
from django.conf import settings
from order.models import Order, OrderItem
# Create your views here.
def _cart_id(request):
cart = request.session.session_key
if not cart:
request.session.create() # it does not return anything. that is why `cart = request.session.create()` will not work
cart = request.session.session_key
return cart # Ultimately return cart
def add_cart(request, product_id):
product = Product.objects.get(id = product_id)
try:
cart = Cart.objects.get(cart_id=_cart_id(request))
except Cart.DoesNotExist:
cart = Cart.objects.create(
cart_id = _cart_id(request)
)
cart.save()
try:
cart_item = CartItem.objects.get(product = product, cart = cart)
if cart_item.quantity < cart_item.product.stock:
cart_item.quantity += 1
cart_item.save()
except CartItem.DoesNotExist:
cart_item = CartItem.objects.create(
product = product,
quantity= 1,
cart = cart,
)
cart_item.save()
return redirect('cart:cart_detail')
def cart_detail(request, total = 0, counter = 0, cart_items = None):
try:
cart = Cart.objects.get(cart_id = _cart_id(request))
cart_items = CartItem.objects.filter(cart = cart, active=True)
for cart_item in cart_items:
total += (cart_item.product.price * cart_item.quantity)
counter += cart_item.quantity
except ObjectDoesNotExist:
pass
stripe.api_key = settings.STRIPE_SECRET_KEY
stripe_total = int(total * 100)
description = 'Perfect Cushion Shop - New Order'
data_key = settings.STRIPE_PUBLISHABLE_KEY
if request.method == "POST":
print(request.POST)
try:
token = request.POST['stripeToken']
email = request.POST['stripeEmail']
billingName = request.POST['stripeBillingName']
billingAddress1 = request.POST['stripeBillingAddressLine1']
billingcity = request.POST['stripeBillingAddressCity']
billingPostcode = request.POST['stripeBillingAddressZip']
billingCountry = request.POST['stripeBillingAddressCountry']
shippingName = request.POST['stripeShippingName']
shippingAddress1 = request.POST['stripeShippingAddressLine1']
shippingcity = request.POST['stripeShippingAddressCity']
shippingPostcode = request.POST['stripeShippingAddressZip']
shippingCountry = request.POST['stripeShippingAddressCountryCode']
customer = stripe.Customer.create(
email = email,
source = token
)
charge = stripe.Charge.create(
amount = stripe_total,
currency = 'pen',
description = description,
customer = customer.id
)
'''Creating the order'''
try:
order_details = Order.objects.create(
token = token,
total = total,
emailAddress = email,
billingName = billingName,
billingAddress1 = billingAddress1,
billingCity= billingcity,
billingPostCode= billingPostcode,
billingCountry = billingCountry,
shippingName = shippingName,
shippingAddress1 = shippingAddress1,
shippingCity=shippingcity,
shippingPostcode = shippingPostcode,
shippingCountry = shippingCountry
)
order_details.save()
for order_item in cart_items:
oi = OrderItem.objects.create(
product = order_item.product.name,
quantity = order_item.quantity,
price = order_item.product.price,
order = order_details
)
oi.save()
print("La orden fue creada")
print("Esta es la orden")
print(str(oi))
return redirect('order:thanks', order_details.id)
except ObjectDoesNotExist:
pass
except stripe.error.CardError as e:
return False,e
return render(request, 'cart.html', dict(cart_items = cart_items, total = total, counter = counter, data_key = data_key, stripe_total = stripe_total,
description = description))
def cart_remove(request, product_id):
cart = Cart.objects.get(cart_id = _cart_id(request))
product = get_object_or_404(Product, id = product_id)
cart_item = CartItem.objects.get(product=product, cart = cart)
if cart_item.quantity > 1:
cart_item.quantity -= 1
cart_item.save()
else:
cart_item.delete()
return redirect('cart:cart_detail')
def full_remove(request, product_id):
cart = Cart.objects.get(cart_id = _cart_id(request))
product = get_object_or_404(Product, id = product_id)
cart_item = CartItem.objects.get(product=product, cart = cart)
cart_item.delete()
return redirect('cart:cart_detail')
答案 0 :(得分:2)
对于两种模型,您必须调用admin.site.register两次:
admin.site.register(Cart)
admin.site.register(CartItem)
答案 1 :(得分:2)
将您的admin.py
编辑为
from django.contrib import admin
from .models import Cart, CartItem
# Register your models here.
admin.site.register(Cart)
admin.site.register(CartItem)
答案 2 :(得分:1)
或者您可以这样做:
admin.site.register([Cart, CartItem])