首页 > 解决方案 > 为什么我的信息没有从数据库中显示

问题描述

我需要帮助解决我项目中的数据库问题。问题在于将带有附加配置文件的订单保存到数据库中。它不会将用户保存到订单中,因此有时订单是半空的,当您尝试显示该用户的所有订单时,您会得到一个空列表。

这是我的代码。

def checkout_success(request, order_number):
    
    save_info = request.session.get('save_info')
    order = get_object_or_404(Order, order_number=order_number)
    print("Order", order)

    profile = UserProfile.objects.get(user=request.user)
    print(profile)
    # Attach the user's profile to the order
    order.user_profile = profile
    order.save()
    print(order.user_profile)

    # Save the user's info
    if save_info:
        profile_data = {
            'default_phone': order.phone,
            'default_billingCountry': order.billingCountry,
            'default_billingPostcode': order.billingPostcode,
            'default_billingCity': order.billingCity,
            'default_billingAdress1': order.billingAdress1
        }
        user_profile_form = UserProfileForm(profile_data, instance=profile)
        print("UPF", user_profile_form)
        if user_profile_form.is_valid():
            print("UPF Valid")
            user_profile_form.save()

    messages.success(request, f'Order successfully processed! \
        Your order number is {order_number}. A confirmation \
        email will be sent to {order.emailAddress}.')

    if 'cart' in request.session:
        del request.session['cart']

    template = 'checkout/checkout_success.html'
    context = {
        'order': order,
    }

    return render(request, template, context)

这是 Order 和 profie 模型

# Model: Order

class Order(models.Model):
    order_number = models.CharField(max_length=35, null=False,editable=False)
    user_profile = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, 
    null=True, blank=True, related_name='orders')  # noqa:501
    billingName = models.CharField(max_length=250, blank=True)
    emailAddress = models.EmailField(max_length=250, blank=True, 
    verbose_name='Email Adress')  # noqa:501
    phone = models.CharField(max_length=15, null=False, default=0)
    billingCountry =  CountryField(blank_label='Country *', null=False, 
    blank=False)  # noqa:501
    billingPostcode = models.CharField(max_length=250, blank=True)
    billingCity = models.CharField(max_length=250, blank=True)
    billingAdress1 = models.CharField(max_length=250, blank=True)
    shippingName = models.CharField(max_length=250, blank=True)
    shippingAddress1 = models.CharField(max_length=250, blank=True)
    shippingCity = models.CharField(max_length=250, blank=True)
    shippingPostcode = models.CharField(max_length=250, blank=True)
    shippingCountry =  CountryField(blank_label='Country *', null=False, 
    blank=False) # noqa:501
    created = models.DateTimeField(auto_now_add=True)
    delivery_cost = models.DecimalField(max_digits=8, decimal_places=2, 
    null=False, default=0)  # noqa:501
    total = models.DecimalField(max_digits=10, null=True, decimal_places=2, 
    verbose_name='USD Order Total')  # noqa:501
    grand_total = models.DecimalField(max_digits=8, decimal_places=2, 
    null=False, default=0)  # noqa:501
    original_cart = models.TextField(null=False, blank=False, default='')
    stripe_pid = models.CharField(max_length=254, null=False, blank=False, 
    default='')  # noqa:501

    def _generate_order_number(self):
        return uuid.uuid4().hex.upper()

    def update_total(self):
        self.total = self.lineitems.aggregate(Sum('lineitem_total')) 
        ['lineitem_total__sum'] or 0  
        if self.total < settings.FREE_DELIVERY_THRESHOLD:
            self.delivery_cost = self.total * 
            settings.STANDARD_DELIVERY_PERCENTAGE / 100 
        else:
            self.delivery_cost = 0
            self.total = self.total + self.delivery_cost
            self.save()

    def save(self, *args, **kwargs):

        if not self.order_number:
            self.order_number = self._generate_order_number()
            super().save(*args, **kwargs)

    def __str__(self):
        return self.order_number

 and the UserProfile model
class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    default_phone = models.CharField(max_length=15, null=True, blank=True)
    default_billingAdress1 = models.CharField(max_length=250, blank=True)
    default_billingCountry = CountryField(blank_label='Country', null=True, 
    blank=True)  
    default_billingPostcode = models.CharField(max_length=250, blank=True)
    default_billingCity = models.CharField(max_length=250, blank=True)

def __str__(self):
    return self.user.username

Apreciate 如果有人可以帮我看看有什么问题,谢谢

标签: pythondjangodatabase

解决方案


推荐阅读