Django ValueError位于--View未返回HttpResponse对象。它没有返回任何结果

Django ValueError位于--View未返回HttpResponse对象。它没有返回任何结果,django,django-views,Django,Django Views,我在提交表单时出错 /en/checkout/视图core.views.EnCheckoutView处的值错误未显示 返回一个HttpResponse对象。它没有返回任何结果 我仔细检查了views.py 有时在删除数据库文件db.sqlite3后:它使用相同的views.py和html模板正常工作,但在重新启动计算机后,同样的错误再次出现 下面是它的视图 class EnCheckoutView(View): def get(self, *args, **kwargs):

我在提交表单时出错

/en/checkout/视图core.views.EnCheckoutView处的值错误未显示 返回一个HttpResponse对象。它没有返回任何结果

我仔细检查了views.py

有时在删除数据库文件db.sqlite3后:它使用相同的views.py和html模板正常工作,但在重新启动计算机后,同样的错误再次出现

下面是它的视图

class EnCheckoutView(View):
    def get(self, *args, **kwargs):
        try:
            order = Order.objects.get(user=self.request.user, ordered=False)
            form = CheckoutForm()
            context = {
                'form': form,
                'couponform': CouponForm(),
                'order': order,
                'DISPLAY_COUPON_FORM': True
            }
            shipping_address_qs = Address.objects.filter(user=self.request.user, address_type='S', default=True)
            if shipping_address_qs.exists():
                context.update({
                    'default_shipping_address': shipping_address_qs[0]
                })

            billing_address_qs = Address.objects.filter(user=self.request.user, address_type='B', default=True)
            if billing_address_qs.exists():
                context.update({
                    'default_billing_address': billing_address_qs[0]
                })

            return render(self.request, 'en-checkout-page.html', context)
        except ObjectDoesNotExist:
            messages.info(self.request, 'You do not have an active order.')
            return redirect('core:en-checkout')

    def post(self, *args, **kwargs):
        form = CheckoutForm(self.request.POST or None)
        try:
            order = Order.objects.get(user=self.request.user, ordered=False)
            if form.is_valid():
                use_default_shipping = form.cleaned_data.get("use_default_shipping")
                if use_default_shipping:
                    print('Using the default shipping address')
                    address_qs = Address.objects.filter(user=self.request.user, address_type='S', customer_name=customer_name, phone=phone, email=email, default=True)
                    if address_qs.exists():
                        shipping_address = address_qs[0]
                        order.shipping_address = shipping_address
                        order.save()
                    else:
                        messages.info(self.request, 'No default shipping address available')
                        return redirect('core:en-checkout')
                else:
                    print('User is entering a new shipping address')
                    customer_name = form.cleaned_data.get('customer_name')
                    phone = form.cleaned_data.get('phone')
                    email = form.cleaned_data.get('email')
                    shipping_address1 = form.cleaned_data.get('shipping_address')
                    shipping_address2 = form.cleaned_data.get('shipping_address2')
                    shipping_country = form.cleaned_data.get('shipping_country')
                    shipping_zip = form.cleaned_data.get("shipping_zip")
                    if is_valid_form([shipping_address1, shipping_country, shipping_zip]):
                        shipping_address = Address(
                            user=self.request.user,
                            customer_name=customer_name,
                            phone=phone,
                            email=email,
                            street_address=shipping_address1,
                            apartment_address=shipping_address2,
                            country=shipping_country,
                            zip=shipping_zip,
                            address_type='S'
                        )
                        shipping_address.save()
                        order.shipping_address = shipping_address
                        order.save()

                        set_default_shipping = form.cleaned_data.get('set_default_shipping')
                        if set_default_shipping:
                            shipping_address.default = True
                            shipping_address.save()

                    else:
                        messages.info(self.request, 'Please fill in the required shipping address fields')

                use_default_billing = form.cleaned_data.get('use_default_billing')
                same_billing_address = form.cleaned_data.get('same_billing_address')
                if same_billing_address:
                    billing_address = shipping_address
                    billing_address.pk = None
                    billing_address.save()
                    billing_address.address_type = 'B'
                    billing_address.save()
                    order.billing_address = billing_address
                    order.save()
                elif use_default_billing:
                    print('Using the default billing address')
                    address_qs = Address.objects.filter(
                        user=self.request.user,
                        address_type='B',
                        default=True
                    )
                    if address_qs.exists():
                        billing_address = address_qs[0]
                        order.billing_address = billing_address
                        order.save()
                    else:
                        messages.info(self.request, 'No default billing address')
                        return redirect('core:checkout')
                else:
                    print('User is entering a new billing address')
                    billing_address1 = form.cleaned_data.get('billing_address')
                    billing_address2 = form.cleaned_data.get('billing_address2')
                    billing_country = form.cleaned_data.get('billing_country')
                    billing_zip = form.cleaned_data.get('billing_zip')

                    if is_valid_form([billing_address1, billing_country, billing_zip]):
                        billing_address = Address(
                            user=self.request.user,
                            street_address=billing_address1,
                            apartment_address=billing_address2,
                            country=billing_country,
                            zip=billing_zip,
                            address_type='B'
                        )

                        billing_address.save()
                        order.billing_address = billing_address
                        order.save()
                        set_default_billing = form.cleaned_data.get('set_default_billing')
                        if set_default_billing:
                            billing_address.default = True
                            billing_address.save()
                    else:
                        messages.info(self.request, 'Please fill in the required billing address fields')

                payment_option = form.cleaned_data.get('payment_option')

                if payment_option == 'S':
                    return redirect('core:payment', payment_option='stripe')
                elif payment_option == 'P':
                    return redirect('core:payment', payment_option='paypal')
                else:
                    messages.warning(self.request, 'Invalid payment option selected')
                    return redirect('core:checkout')

        except ObjectDoesNotExist:
            messages.warning(self.request, 'You do not have an active order')
            return redirect('core:en-order-summary')
谢谢你的帮助

您的post方法中有太多的WAAAYYYY代码-您应该将所有逻辑提取到表单的save方法,使用适当的表单验证,尽可能多地使用modelforms,并将其拆分为简单、可读和可测试的方法

话虽如此,只要您提取if form.is_下的所有代码,您的问题就显而易见了——没有其他分支。因此,如果表单未验证,则函数确实不会返回任何值

编辑

我将在前面添加其他内容,除了…………,对吗

你必须将它添加到与if form.u相同的级别。它是否有效-现在它在这盘意大利面中的位置超出了我的阅读能力,老实说:-/

作为一般规则,考虑如果函数中有超过20行和2级缩进,那么可能是重构代码的时候了。第一个明显的重构是移动对象以减少缩进级别。在您的情况下,您可以先将except子句移动到唯一有意义的位置之后:

def post(self, *args, **kwargs):
    try:
        order = Order.objects.get(user=self.request.user, ordered=False)
    except Order.DoesNotExist:
        messages.warning(self.request, 'You do not have an active order')
        return redirect('core:en-order-summary')

    form = CheckoutForm(self.request.POST or None)
    if form.is_valid():
        # etc....
您已经获得了一个缩进级别,并将try块减少到严格的最小值,这样,如果在您调用的某些代码中出现另一个意外的DoesNotExist异常,它将无法捕获该异常

然后正确使用表单验证-例如:

if address_qs.exists():
    shipping_address = address_qs[0]
    order.shipping_address = shipping_address
    order.save()
else:
    messages.info(self.request, 'No default shipping address available')
    return redirect('core:en-checkout')
这显然是错误的,并且对用户非常粗鲁,用户将不得不再次键入所有内容。表单本身应该验证这一点。事实上,如果用户还没有默认的发货地址,它甚至不应该显示使用默认发货选项

实际上,您的视图代码应该看起来像:

def post(self, *args, **kwargs):
    try:
        order = Order.objects.get(user=self.request.user, ordered=False)
    except Order.DoesNotExist:
        messages.warning(self.request, 'You do not have an active order')
        return redirect('core:en-order-summary')


    form = CheckoutForm(self.request.POST, order=order)
    if form.is_valid():
        form.save() 
        # this  is supposed to has been validated by the form too
        payment_option = form.get_payment_option()
        return redirect('core:payment', payment_option=payment_option)

    # factor out all the common code creating the context
    # for both get and post in a get_context_data method
    context = self.get_context_data()
    context["form"] = form
    return render(self.request, 'en-checkout-page.html', context)

其他所有内容都应使用表单的验证和保存方法。

您能告诉我还应该删除哪些内容吗?您能复制并粘贴应该删除的行吗?我重复一遍:我在哪里说过应该删除的内容?抱歉!我将在之前添加其他地址,除了………………,对吗?最近,我发现我的结账表不接受新地址,只接受保存的地址。我的看法是: