Всем привет! Начал делать интернет магазин, и столкнулся с такой проблемой, не получается нормально сделать заказ для анонимного пользователя. Создание корзины и добавление товаров в нее для анонимов реализовал через сессии примерно таким образом
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)
Понятно что он не может получить пользователя, если он анонимный. Пробовал создать гостевого пользователя и привязывать все к нему, но тогда после заказа не обновляется корзина у анонима. Так же нашел статьи что можно сделать временную регистрацию, но реализовать у меня это не получилось. Подскажите пожалуйста, как это исправить? Заранее спасибо :)