当用户启动会话时,我需要创建一个随机值,并在用户登录或注册后将其存储。用户注销后必须删除。
我正在使用session.session_key
,但可以是任何其他随机值。
为什么要session.session_key
?,因为它会在用户进入网站时自动生成。
当用户进入网站时,他们可以add items
到其shopping cart
,但是直到logs in
或signs up
才能购买。所有cart_items都将random value
用作token
,因此,如果我可以在用户登录或注册后保存此值,则可以查询已经保存在数据库中的cart_items并还原用户已经放入的项目shopping cart
。
因此,当用户输入新的session.session_key
时,但是在用户logs in
或signs up
之后创建了另一个session.session_key
。使得无法使用此值在用户not logged in
和user logged in
之间建立流。
我的逻辑:
1.-将session.session_key
保存在Cookie中。
2.-用户登录或注册后,将创建一个新的session.session_key
。我们需要用保存在Cookie中的session.session_key
替换新的session.session_key
。
3.-变旧def _cart_id(request):
cart = request.session.session_key
if not cart:
request.session.create()
cart = request.session.session_key
return cart # Ultimately return cart
来查询使用该值作为ID创建的所有对象并进行处理。
代码:
此功能会生成需要存储的购物车ID:
@transaction.atomic
def signupView(request):
if request.method == 'POST':
...do stuff ...
### Save cart id in Cookie before authenticating
set_cookie_values(request)
### Authentication
user = authenticate(username=username, password=raw_password)
login(request, user)
### Get cart id from Cookie
cart = request.COOKIES.get('cart', '')
delete_cookie_values(request)
return redirect('cart:cart_detail')
else:
profile_form = ProfileForm(district_list, province_list, department_list)
return render(request, 'accounts/signup.html', {
'user_form': user_form,
'profile_form': profile_form
})
注册视图:
def set_cookie_values(request):
try:
cart_id =_cart_id(request)
response = HttpResponse()
response.set_cookie('cart_id', cart_id, max_age=9999999999)
except ObjectDoesNotExist:
pass
return response
def delete_cookie_values(request):
response = HttpResponse()
response.delete_cookie('cart_id')
return response
用于存储和删除Cookie中的值的助手:
import secrets
# Create your views here.
def _cart_id(request):
if 'cart_id' in request.session:
cart_id = request.session['cart_id']
else:
cart_id = secrets.token_urlsafe(22)
return cart_id
我会很高兴帮助您检查我的伪代码,以便将cart_id存储在Cookie上并进行检索。
更新1:
在丹尼尔·罗斯曼(Daniel Roseman)发表评论之后,我想我需要将cart_id存储在会话中,在用户注销时将其删除,在用户向购物车中添加新商品时生成一个新的1,在注销时将其删除,依此类推。
我想以保存用户的OrderItem的形式进行操作,但是我不知道该怎么做:
class StepTwoView(CreateView):
form_class = StepTwoForm
template_name = 'shop/subir-arte.html'
success_url = '/cart/'
def get_initial(self):
initial = super(StepTwoView, self).get_initial()
initial['cart_id'] = secrets.token_urlsafe(22)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['product'] = Product.objects.get(
category__slug=self.kwargs['c_slug'],
slug=self.kwargs['product_slug']
)
return context
def form_valid(self, form):
try:
cart = Cart.objects.get(cart_id=_cart_id(self.request))
except Cart.DoesNotExist:
cart = Cart.objects.create(
cart_id = _cart_id(self.request)
)
cart.save()
self.request.session['cart_id'] = self.initial['cart_id']
form.instance.cart = cart
form.instance.product = Product.objects.get(
category__slug=self.kwargs['c_slug'],
slug=self.kwargs['product_slug']
) # get tamanios from session
form.instance.size = self.request.session.get('size') # get tamanios from session
form.instance.quantity = self.request.session.get('quantity') # get cantidades from session
del self.request.session['quantity'] # delete cantidades value from session
del self.request.session['size'] # delete tamanios value from session
self.request.session.modified = True
return super(StepTwoView, self).form_valid(form)
表单类:
KeyError at /shop/stickers/stickers-cuadrados/subir-arte
'cart_id'
self.request.session['cart_id'] = self.initial['cart_id']
但是我得到了:
{{1}}
答案 0 :(得分:1)
您正在以错误的方式做事。用户登录时,会话密钥会更新,但会话的内容会保留。因此,您应该为购物车分配一个单独的随机ID,并将其存储在会话中。