Ошибка IntegrityError в / add_to_cart / NOT NULL: - PullRequest
0 голосов
/ 21 октября 2019

У меня есть представление, которое добавляет товары в корзину, но когда я пытаюсь добавить товары в корзину, Item модель выдает ошибку. Сбой ограничения NOT NULL: cart_item.product_id

Я создал модельный предмет для захвата выбранных предметов

Вот мои models.py

from django.db import models
from django.contrib.auth.models import User
# Create your models here.


class Product(models.Model):
    product_title = models.CharField(null=True, blank=True,max_length=200)
    product_price = models.IntegerField(null=True, blank=True,)
    product_image = models.ImageField(upload_to='cart/products/', null=True, blank=True)

    def __str__(self):
        return self.product_title

class Cart_Bucket(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    create_date = models.DateTimeField(null=True, blank=True,verbose_name='create_date', auto_now=True)
    checked_out = models.BooleanField(default=False, verbose_name='checked_out')

    def __unicode__(self):
        return unicode(self.create_date)

class Item(models.Model):
    cart = models.ForeignKey(Cart_Bucket, verbose_name='cart', on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(verbose_name='quantity')
    product = models.ForeignKey(Product, verbose_name='product', related_name='product', on_delete=models.CASCADE)

    def __str__(self):
        return u'%d units' % (self.quantity)

Views.py

def add_to_cart(request):
    user = request.user
    if not user.is_authenticated:
        chars = string.ascii_uppercase + string.digits
        user_name = ''.join(random.choice(chars) for _ in range(9))
        password = '1234567a'
        user = User.objects.create(username=user_name, first_name='guest', last_name='guest', email='guest@gmail.com', is_active=True, is_staff=True)
        user.set_password(password)
        user.save()
        user = authenticate(username=user_name, password=password)
        if user:
            login(request, user)

    product_id = request.GET.get('product_id')
    cart = Cart_Bucket.objects.filter(checked_out=False, user=user)
    cart = cart[0] if cart else ''
    if not cart:
        cart = Cart_Bucket.objects.create(user=user)

    Item.objects.create(cart=cart, product_id=product_id, quantity=1)
    print(Item.objects.all)
    return render(request, 'products/products.html')

my products.html

{% extends 'home/base.html' %}

{% block body %}

<div class="row">
        {% for products in product %}
        <div class="col-md-6 col-centered">

                <img src="{{ products.product_image.url }}" style="width: 30%;display:block;margin:0 auto;">
                <div class="row">
                    <div class="col-md-2"></div>
                    <div class="col-md-6">
                        <br>
                        <p>{{ products.product_title }}  Price : $ {{ products.product_price }} </p>

                    </div>
                    <div class="col-md-6"></div>
                    <div class="col-md-4">
                        <a href="{% url 'add_to_cart' %}?products_id={{ products.id }}" class="btn btn-success" role="button">Add to Cart</a>
                    </div>
                    <div class="col-md-2"></div>
                </div>    
                <hr>
        </div>

        {% endfor %}
</div>
{% endblock %}

Я хочу видеть элементы add_to_cart на странице корзины

1 Ответ

0 голосов
/ 21 октября 2019

Я думаю, что возникает проблема, потому что Item.objects.create() сначала пытается сохранить модель в базе данных, прежде чем анализировать все аргументы. Основываясь на документации Django, метод .save() имеет некоторые преимущества перед методом create(). Эта проблема должна быть решена, если вы измените свой код следующим образом:

newItem = Item()
newItem.cart = cart
newItem.product_id = product_id
newItem.quantity = 1
newItem.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...