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 old
session.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以获取提示。我要试试这个新方法。我已经解决了。我把自己弄得太复杂了。