我正在尝试用 Django 制作一个电子商务网站,我一直在关注这个在线课程和文档。
当我更新登录表单以获得更好的用户体验时,我在购物车视图中遇到了一个错误。我认为这很奇怪,因为我没有更改购物车应用程序中的订单或结帐视图中的任何内容。所以这里是完整的回溯:
>Environment:
>
>
>Request Method: GET
>Request URL: root/cart/checkout/
>
>Django Version: 2.2.12
>Python Version: 3.6.9
>Installed Applications:
>['django.contrib.admin',
> 'django.contrib.auth',
> 'django.contrib.contenttypes',
> 'django.contrib.sessions',
> 'django.contrib.messages',
> 'django.contrib.staticfiles',
> 'storages',
> 'accounts',
> 'addresses',
> 'analytics',
> 'billing',
> 'carts',
> 'marketing',
> 'orders',
> 'products',
> 'search',
> 'tags']
>Installed Middleware:
>['django.middleware.security.SecurityMiddleware',
> 'django.contrib.sessions.middleware.SessionMiddleware',
> 'django.middleware.common.CommonMiddleware',
> 'django.middleware.csrf.CsrfViewMiddleware',
> 'django.contrib.auth.middleware.AuthenticationMiddleware',
> 'django.contrib.messages.middleware.MessageMiddleware',
> 'django.middleware.clickjacking.XFrameOptionsMiddleware']
>
>
>
>Traceback:
>
>File "/home/ray/Dev/rxvenv/lib/python3.6/site-packages/django/core/handlers/exception.py" in >inner
> 34. response = get_response(request)
>
>File "/home/ray/Dev/rxvenv/lib/python3.6/site-packages/django/core/handlers/base.py" in >_get_response
> 115. response = self.process_exception_by_middleware(e, request)
>
>File "/home/ray/Dev/rxvenv/lib/python3.6/site-packages/django/core/handlers/base.py" in >_get_response
> 113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
>
>File "/home/ray/Dev/rxvenv/src/carts/views.py" in checkout_home
> 79. login_form = LoginForm()
>
>Exception Type: TypeError at /cart/checkout/
>Exception Value: __init__() missing 1 required positional argument: 'request'
根据回溯,我的错误来自 src/carts/view.py,特别是我对 LoginForm 的调用。这是引发异常的文件,但我省略了一些代码,以免太冗长。
所以当我调用 LoginForm 时错误是导致的。LoginForm 必须是问题的根源,因为这是我上次测试购物车结帐视图以来唯一更改的内容。它一定是我最近的更改之一,所以这里是:
# src/accounts/forms.py
from django import forms
from django.contrib.auth import authenticate, login, get_user_model
from django.urls import reverse
from django.utils.safestring import mark_safe
User = get_user_model()
class LoginForm(forms.Form):
email = forms.EmailField(label='Email')
password = forms.CharField(widget=forms.PasswordInput)
# the error is saying "__init__() missing 1 required positional argument: 'request':
# so that must mean that the error is being caused by a call or this definition
def __init__(self, request, *args, **kwargs):
self.request = request
super(LoginForm, self).__init__(*args, **kwargs)
def clean(self):
request = self.request
data = self.cleaned_data
email = data.get("email")
password = data.get("password")
qs = User.objects.filter(email=email)
if qs.exists():
# user email is registered, check active/
not_active = qs.filter(is_active=False)
if not_active.exists():
## not active, check email activation
link = reverse("account:resend-activation")
reconfirm_msg = """Go to <a href='{resend_link}'>
resend confirmation email</a>.
""".format(resend_link = link)
confirm_email = EmailActivation.objects.filter(email=email)
is_confirmable = confirm_email.confirmable().exists()
if is_confirmable:
msg1 = "Please check your email to confirm your account or " + reconfirm_msg.lower()
raise forms.ValidationError(mark_safe(msg1))
email_confirm_exists = EmailActivation.objects.email_exists(email).exists()
if email_confirm_exists:
msg2 = "Email not confirmed. " + reconfirm_msg
raise forms.ValidationError(mark_safe(msg2))
if not is_confirmable and not email_confirm_exists:
raise forms.ValidationError("This user is inactive.")
user = authenticate(request, username=email, password=password)
if user is None:
raise forms.ValidationError("Invalid credentials")
login(request, user)
self.user = user
return data
# src/carts/views.py
from django.shortcuts import render, redirect
from accounts.forms import LoginForm, GuestForm
from accounts.models import GuestEmail
from addresses.forms import AddressForm
from addresses.models import Address
from billing.models import BillingProfile
from orders.models import Order
from products.models import Product
from .models import Cart
def checkout_home(request):
cart_obj, cart_created = Cart.objects.new_or_get(request)
order_obj = None
if cart_created or cart_obj.products.count() == 0:
return redirect("cart:home")
print('request', request)
login_form = LoginForm() #this line is causing an error
guest_form = GuestForm()
address_form = AddressForm()
billing_address_id = request.session.get("billing_address_id", None)
shipping_address_id = request.session.get("shipping_address_id", None)
billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
address_qs = None
has_card = False
if billing_profile is not None:
if request.user.is_authenticated:
address_qs = Address.objects.filter(billing_profile=billing_profile)
order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj)
if shipping_address_id:
order_obj.shipping_address = Address.objects.get(id=shipping_address_id)
del request.session["shipping_address_id"]
if billing_address_id:
order_obj.billing_address = Address.objects.get(id=billing_address_id)
del request.session["billing_address_id"]
if billing_address_id or shipping_address_id:
order_obj.save()
has_card = billing_profile.has_card
if request.method == "POST":
"check that order is done"
is_prepared = order_obj.check_done()
if is_prepared:
did_charge, crg_msg = billing_profile.charge(order_obj)
if did_charge:
order_obj.mark_paid()
request.session['cart_items'] = 0
del request.session['cart_id']
if not billing_profile.user:
'''
is this the best spot?
'''
billing_profile.set_cards_inactive()
return redirect("cart:success")
else:
print(crg_msg)
return redirect("cart:checkout")
context = {
"object": order_obj,
"billing_profile": billing_profile,
"login_form": login_form,
"guest_form": guest_form,
"address_form": address_form,
"address_qs": address_qs,
"has_card": has_card
}
return render(request, "carts/checkout.html", context)
您的LoginForm
表单__init__
将请求作为位置参数,但您没有提供它
login_form = LoginForm(request)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句