Django ValueError位于--View未返回HttpResponse对象。它没有返回任何结果
我在提交表单时出错 /en/checkout/视图core.views.EnCheckoutView处的值错误未显示 返回一个HttpResponse对象。它没有返回任何结果 我仔细检查了views.py 有时在删除数据库文件db.sqlite3后:它使用相同的views.py和html模板正常工作,但在重新启动计算机后,同样的错误再次出现 下面是它的视图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):
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)
其他所有内容都应使用表单的验证和保存方法。您能告诉我还应该删除哪些内容吗?您能复制并粘贴应该删除的行吗?我重复一遍:我在哪里说过应该删除的内容?抱歉!我将在之前添加其他地址,除了………………,对吗?最近,我发现我的结账表不接受新地址,只接受保存的地址。我的看法是: