Интернет-магазин в django. Как выводить в профиле и фильтровать заказы пользователя?
У меня есть несколько моделей. Модель Заказа(Order), модель товара в заказе(OrderItem), а также есть модель пользователя (User)
Order models:
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='orders', verbose_name="Заказы")
first_name = models.CharField('Имя', max_length=50)
last_name = models.CharField('Фамилия', max_length=50)
email = models.EmailField()
phone = models.CharField('Телефон', max_length=50, default='')
address = models.CharField('Адрес', max_length=250)
postal_code = models.CharField('Почтовый индекс', max_length=20)
city = models.CharField('Населенный пункт', max_length=100)
created = models.DateTimeField('Создано', auto_now_add=True)
updated = models.DateTimeField('Обновлено', auto_now=True)
paid = models.BooleanField('Оплачено', default=False)
coupon = models.ForeignKey(Coupon, related_name='orders', verbose_name="Купон", null=True, blank=True,
on_delete=models.SET_NULL)
discount = models.IntegerField('Размер скидки %', default=0,
validators=[MinValueValidator(0), MaxValueValidator(100)])
class Meta:
ordering = ('-created',)
verbose_name = 'Заказ'
verbose_name_plural = lazy(
lambda: _('Заказы ({})').format(Order.objects.count()), str)()
def __str__(self):
return 'Order {}'.format(self.id)
def get_total_cost(self):
total_cost = sum(item.get_cost() for item in self.items.all())
return total_cost - total_cost * (self.discount / Decimal('100'))
class OrderItem(models.Model):
order = models.ForeignKey(
Order, related_name='items', on_delete=models.CASCADE)
book = models.ForeignKey(Book, verbose_name="Книги",
related_name='order_items', on_delete=models.CASCADE)
price = models.DecimalField('Цена', max_digits=10, decimal_places=2)
quantity = models.PositiveIntegerField('Количество', default=1)
def __str__(self):
return '{}'.format(self.id)
def get_cost(self):
return self.price * self.quantity
Profile views:
@login_required
def profile(request):
myorders = Order.objects.filter(user=request.user)
if request.method == "POST":
img_profile = ProfileImage(
request.POST, request.FILES, instance=request.user.profile)
update_user = UserUpdateForm(request.POST, instance=request.user)
if update_user.is_valid() and img_profile.is_valid():
update_user.save()
img_profile.save()
messages.add_message(request, settings.MY_INFO,
f'Информация была успешно обновлена')
return redirect('profile')
else:
img_profile = ProfileImage(instance=request.user.profile)
update_user = UserUpdateForm(instance=request.user)
data = {
'img_profile': img_profile,
'update_user': update_user
}
return render(request, 'users/profile.html', data)
Ответы (1 шт):
Автор решения: Andrey Maslov
→ Ссылка
ты же отфильтровал заказы пользователя
myorders = Order.objects.filter(user=request.user)
что бы вывести их в шаблоне передай из в контекст, так же как ты это делаешь с img_profile и update_user
data = {
'img_profile': img_profile,
'update_user': update_user,
'myorders': myorders,
}
и используй дальше в шаблоне эту переменную