@SilvestrVStolovoy

Как сделать заказ для анонимного пользователя?

Всем привет! Начал делать интернет магазин, и столкнулся с такой проблемой, не получается нормально сделать заказ для анонимного пользователя. Создание корзины и добавление товаров в нее для анонимов реализовал через сессии примерно таким образом

class CartMixin(View):

    def dispatch(self, request, *args, **kwargs):
        if not request.session.session_key:
            request.session.save()
        self.session = request.session

        if request.user.is_authenticated:
            customer = Customer.objects.filter(user=request.user).first()
            if not customer:
                customer = Customer.objects.create(user=request.user)
            cart = Cart.objects.filter(owner=customer, in_order=False).first()
            if not cart:
                cart = Cart.objects.create(owner=customer)
        else:
            cart = Cart.objects.filter(session_key=self.session.session_key, for_anonymous_user=True).first()
            if not cart:
                cart = Cart.objects.create(session_key=self.session.session_key, for_anonymous_user=True)
        self.cart = cart
        return super().dispatch(request, *args, **kwargs)


Это модель корзины

class Cart(models.Model):

    owner = models.ForeignKey('Customer', null=True, verbose_name='Владелец', on_delete=models.CASCADE)
    products = models.ManyToManyField(CartProduct, blank=True, related_name='related_cart')
    total_products = models.PositiveIntegerField(default=0)
    final_price = models.DecimalField(max_digits=9, default=0, decimal_places=2, verbose_name='Общая стоимость')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания заказа')
    in_order = models.BooleanField(default=False)
    for_anonymous_user = models.BooleanField(default=False)
    session_key = models.CharField(max_length=32, null=True)


И тут вроде все хорошо, корзины создаются, товар добавляется/удаляется, все как надо. Проблемы возникают при попытке оформить заказ.

Форма заказа во views.py выглядит так:

class MakeOrderView(CartMixin, View):

    @transaction.atomic
    def post(self, request, *args, **kwargs):
        form = OrderForm(request.POST or None)
        if request.user.is_authenticated:
            customer = Customer.objects.get(user=request.user)
        if form.is_valid():
            new_order = form.save(commit=False)
            new_order.customer = customer
            new_order.first_name = form.cleaned_data['first_name']
            new_order.last_name = form.cleaned_data['last_name']
            new_order.phone = form.cleaned_data['phone']
            new_order.address = form.cleaned_data['address']
            new_order.buying_type = form.cleaned_data['buying_type']
            new_order.order_date = form.cleaned_data['order_date']
            new_order.comment = form.cleaned_data['comment']
            new_order.save()
            self.cart.in_order = True
            self.cart.save()
            # msg = str(self.cart.products.values('product'))
            # send_mail('Заказ', msg, 'rsp.farm.mail@yandex.ru', ['andrei.f1234@gmail.com'])
            new_order.cart = self.cart
            new_order.save()
            customer.orders.add(new_order)
            messages.add_message(request, messages.INFO, 'Спасибо за заказ')
            return HttpResponseRedirect('/')
        return HttpResponseRedirect('/checkout/')


Как я понял, ошибка в этой строчке, ее надо как-то доработать
if request.user.is_authenticated:
            customer = Customer.objects.get(user=request.user)

Понятно что он не может получить пользователя, если он анонимный. Пробовал создать гостевого пользователя и привязывать все к нему, но тогда после заказа не обновляется корзина у анонима. Так же нашел статьи что можно сделать временную регистрацию, но реализовать у меня это не получилось. Подскажите пожалуйста, как это исправить? Заранее спасибо :)
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@bacon
Сделать у модели Order, такие же поля для анонимного пользователя, как и у Cart, ну и такую же логику работы.
ЗЫ хотя я бы, сразу создавал юзера, в тот момент когда бы понадобилась корзина, возможно и раньше (такое обычно очень хотят маркетологи) и не нужно было бы городить дополнительную логику работы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы