Python Django:在用户登录或注册后存储值
我需要在用户启动会话时创建一个随机值,并在用户登录或注册后存储该值。必须在用户注销后删除 我正在使用Python Django:在用户登录或注册后存储值,python,django,Python,Django,我需要在用户启动会话时创建一个随机值,并在用户登录或注册后存储该值。必须在用户注销后删除 我正在使用session.session\u键,但可以是任何其他随机值 为什么会话。会话\u键?因为它是在用户进入网站时自动生成的 当用户进入网站时,他们可以将物品添加到他们的购物车,但在登录或注册之前不能购买。所有购物车项目都使用随机值作为标记,因此,如果用户登录或注册后我可以保存此值,我可以查询已保存在DB中的购物车项目,并还原用户已放入此购物车的项目 因此,当用户进入新的会话时,会创建会话密钥,但在用
session.session\u键
,但可以是任何其他随机值
为什么会话。会话\u键
?因为它是在用户进入网站时自动生成的
当用户进入网站时,他们可以将物品添加到他们的购物车,但在登录或注册之前不能购买。所有购物车项目都使用随机值
作为标记
,因此,如果用户登录或注册后我可以保存此值,我可以查询已保存在DB中的购物车项目,并还原用户已放入此购物车的项目
因此,当用户进入新的会话时,会创建会话密钥
,但在用户登录
或注册后
会创建另一个会话。会话密钥
。使得无法使用此值在未登录的用户和登录的用户之间建立流
我的逻辑:
1.-在Cookie中保存session.session\u key
。
2.-在用户登录或注册新的会话后。创建会话密钥。我们需要用保存在Cookie中的会话密钥替换新的会话。会话密钥。
3.-Get oldsession.session\u key
查询使用此值作为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
})
用于存储和删除Cookie中的值的帮助程序:
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上存储购物车id的伪代码,我将不胜感激,并将其检索
更新1:
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)
在Daniel Roseman的评论之后,我认为我需要在会话中存储购物车id,在用户注销时删除它,在用户向购物车广告新项目时生成新的1,在注销时删除它,等等
我想以保存用户OrderItem的形式执行此操作,但我不知道具体如何执行:
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
表单类:
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']
你的做法不对。当用户登录时,会话密钥将被更新,但会话的内容将被保留。因此,您应该为购物车提供一个单独的随机ID,并将其存储在会话中。ty以获取提示。我要试试这个新方法。我已经解决了。我把自己弄得太复杂了。