Django:在用户登录或注册后存储值

时间:2018-12-28 23:48:18

标签: python django

当用户启动会话时,我需要创建一个随机值,并在用户登录注册后将其存储。用户注销后必须删除。

我正在使用session.session_key,但可以是任何其他随机值。

为什么要session.session_key,因为它会在用户进入网站时自动生成。

当用户进入网站时,他们可以add items到其shopping cart,但是直到logs insigns up才能购买。所有cart_items都将random value用作token,因此,如果我可以在用户登录或注册后保存此值,则可以查询已经保存在数据库中的cart_items并还原用户已经放入的项目shopping cart

因此,当用户输入新的session.session_key时,但是在用户logs insigns up之后创建了另一个session.session_key。使得无法使用此值在用户not logged inuser 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}}

1 个答案:

答案 0 :(得分:1)

您正在以错误的方式做事。用户登录时,会话密钥会更新,但会话的内容会保留。因此,您应该为购物车分配一个单独的随机ID,并将其存储在会话中。