Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56

Как вывести историю заказов?

16.11.2020, 12:51. Показов 6618. Ответов 18

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажие как отобразить историю заказов в профиле конкретного пользователя.

Приложение "Orders"

models.py

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from django.db import models
import django
from shop.models import Product
from django.contrib.auth.models import User
 
class Order(models.Model):
    
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    
    postal_code = models.CharField(max_length=20)
    city = models.CharField(max_length=100)
    street = models.CharField(max_length=100, default="s")
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
 
    class Meta:
        ordering = ('-created',)
        verbose_name = 'Заказ'
        verbose_name_plural = 'Заказы'
 
    def __str__(self):
        return 'Order {}'.format(self.id)
 
    def get_total_cost(self):
        return sum(item.get_cost() for item in self.items.all())
 
 
class OrderItem(models.Model):
    
    order = models.ForeignKey(Order, related_name='items')
    product = models.ForeignKey(Product, related_name='order_items')
    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
views.py

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
 
 
def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            # очистка корзины
            cart.clear()
            return render(request, 'orders/order/created.html',
                          {'order': order})
    else:
        form = OrderCreateForm
    return render(request, 'orders/order/create.html',
                  {'cart': cart, 'form': form})
urls.py

Code
1
2
3
4
5
6
7
from django.conf.urls import url
from . import views
 
 
urlpatterns = [
    url(r'^create/$', views.order_create, name='order_create'),
]
forms.py

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from django import forms
from .models import Order
from django.contrib.auth.models import User
 
 
class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'email',  'postal_code', 'city', 'street',]
        widgets = {
            'first_name': forms.TextInput(attrs={"class": "form-control", "placeholder": "Имя"}),
            'last_name': forms.TextInput(attrs={"class": "form-control", "placeholder": "Фамилия"}),
            'email': forms.EmailInput(attrs={"class": "form-control", "placeholder": "e-mail"}),
            'postal_code': forms.TextInput(attrs={"class": "form-control", "placeholder": "Почтовый индекс"}),
            'city': forms.TextInput(attrs={"class": "form-control", "placeholder": "Город"}),
            'street': forms.TextInput(attrs={"class": "form-control", "placeholder": "Улица"}),
 
            }


Заказ не связан с конкретным пользователем. Нужно как-то связать. В каком направлении копать нужно?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2020, 12:51
Ответы с готовыми решениями:

Страница с формами редактирования заказов + постраничный вывод = пустышки, если кол. заказов < заказов на стр.
Добрый день. Есть у меня страничка обновления заказов с вот таким кодом &lt;? /* Соединяемся с базой данных */ /* Таблица...

Как вывести список заказов, на сумму больше 100?
Всем привет. Есть три таблицы: 1. users(юзеры): поля: user_id, name. 2. products(продукты): поля: prod_id, prod_name. 3....

Как вывести фото товара и опции в Истории заказов?
Как можно вывести фото товара и опции (типа цвет, размер и пр.) в Истории заказов клиента? Вывести нужно именно в таблице в общей разделе...

18
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
16.11.2020, 13:08
Вместо first- и last-name надо в модель положить ForeignKey на User.
1
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
17.11.2020, 18:02  [ТС]
Не помогает , выходит что в админке в поле user = ForeignKey(User) всегда один и тот же пользователь
0
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
18.11.2020, 02:21
Админка-то тут причём?
1
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 12:30  [ТС]
Нужно чтобы когда пользователь заполнял форму заказа, в Базу Данных автоматически вносился Nickname этого пользователя, который он указывал при регистрации. В форме есть поля Имя и Фамилия, поле nickname автоматически должно заполнятся. В базу данных Order уже внесено поле nickname=ForeignKey(User) Далее, нужно выводить заказы, которые соответствуют конкретному пользователю.

Что почитать или что посмотреть на эту тему? Подскажите.
0
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
18.11.2020, 13:01
Я не вижу, чтобы nickname как-то использовался. Ещё раз:
Вместо first- и last-name надо в модель положить ForeignKey на User.
1
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 15:23  [ТС]
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from django.db import models
import django
from shop.models import Product
from django.contrib.auth.models import User
 
class Order(models.Model):
    
    nickname= models.ForeignKey(User, on_delete=CASCADE)
    email = models.EmailField()
    
    postal_code = models.CharField(max_length=20)
    city = models.CharField(max_length=100)
    street = models.CharField(max_length=100, default="s")
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
 
    class Meta:
        ordering = ('-created',)
        verbose_name = 'Заказ'
        verbose_name_plural = 'Заказы'
 
    def __str__(self):
        return 'Order {}'.format(self.id)
 
    def get_total_cost(self):
        return sum(item.get_cost() for item in self.items.all())
 
 
class OrderItem(models.Model):
    
    order = models.ForeignKey(Order, related_name='items')
    product = models.ForeignKey(Product, related_name='order_items')
    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
forms.py

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django import forms
from .models import Order
from django.contrib.auth.models import User
 
 
class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['nickname', 'email',  'postal_code', 'city', 'street',]
        widgets = {
            'nickname':forms.HiddenInput()
            'email': forms.EmailInput(attrs={"class": "form-control", "placeholder": "e-mail"}),
            'postal_code': forms.TextInput(attrs={"class": "form-control", "placeholder": "Почтовый индекс"}),
            'city': forms.TextInput(attrs={"class": "form-control", "placeholder": "Город"}),
            'street': forms.TextInput(attrs={"class": "form-control", "placeholder": "Улица"}),
 
            }
Добавил. Теперь нужно как-то во Views это поле использовать? И какое поле формы применить. На всякий написал HidenInput.

Добавлено через 26 минут
views.py

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ef order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            # очистка корзины
            cart.clear()
            return render(request, 'orders/order/created.html',
                          {'order': order})
    else:
        form = OrderCreateForm
    return render(request, 'orders/order/create.html',
                  {'cart': cart, 'form': form})
Добавлено через 38 минут
Теперь в этом поле он просит вписывать не строчные значения, а численные. То есть просит вписать id пользователя. Как сделать,чтобы в это поле автоматически вписывался id авторизованного пользователя. Ну или ИМЯ его, тогда и само поле должно запрашивать ИМЯ, а не id
0
15 / 12 / 4
Регистрация: 06.04.2020
Сообщений: 95
18.11.2020, 18:00
Python
1
2
3
class Order(models.Model):    
   author = models.ForeignKey(User, on_delete=CASCADE)
   ...
Python
1
2
3
4
5
6
7
8
9
10
11
12
class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = '__all__'
        exclude = ('author',)
        widgets = {
            'email': forms.EmailInput(attrs={"class": "form-control", "placeholder": "e-mail"}),
            'postal_code': forms.TextInput(attrs={"class": "form-control", "placeholder": "Почтовый индекс"}),
            'city': forms.TextInput(attrs={"class": "form-control", "placeholder": "Город"}),
            'street': forms.TextInput(attrs={"class": "form-control", "placeholder": "Улица"}),
            }
...
Во вью:
Python
1
2
3
4
5
6
...
       if form.is_valid():
          order = form.save(commit=False)
          self.object.author = self.request.user
          order.save()
...
1
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 18:12  [ТС]
Сделал как у вас, НО
0
21 / 12 / 9
Регистрация: 12.02.2020
Сообщений: 126
18.11.2020, 18:16
Лучший ответ Сообщение было отмечено OlegFedotov как решение

Решение

OlegFedotov, из формс удали nickname
Во вьюхе
if form.is_valid():
order = form.save(commit=False)
order.nickname = request.user #Получаешь авторизованного пользователя
order.save() #Сохраняешь значения из формы

Добавлено через 3 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = [ 'email',  'postal_code', 'city', 'street',]
        widgets = {
             'email': forms.EmailInput(attrs={"class": "form-control", "placeholder": "e-mail"}),
            'postal_code': forms.TextInput(attrs={"class": "form-control", "placeholder": "Почтовый индекс"}),
            'city': forms.TextInput(attrs={"class": "form-control", "placeholder": "Город"}),
            'street': forms.TextInput(attrs={"class": "form-control", "placeholder": "Улица"}),
 
            }
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save(commit=False)
            order.nickname = request.user
            order.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            # очистка корзины
            cart.clear()
            return render(request, 'orders/order/created.html',
                          {'order': order})
    else:
        form = OrderCreateForm
    return render(request, 'orders/order/create.html',
                  {'cart': cart, 'form': form})
1
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 18:19  [ТС]
Получилось!
Миниатюры
Как вывести историю заказов?  
0
21 / 12 / 9
Регистрация: 12.02.2020
Сообщений: 126
18.11.2020, 18:26
OlegFedotov, а теперь внимательно посмотри forms, который я прислал и тот, что ты сейчас демонстрируешь. Разницу видишь?
0
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 18:29  [ТС]
Да. Теперь форма "Чистая" , без этого списка. И в админке сохраняется nickname





Огромное спасибо! )

P.S. Для людей , которые , возможно будут читать эту тему. В сообщении ,где я пишу "Получилось!" не знаю как удалить картинку под надписью. Получится должно как в именно в ЭТОМ сообщении.
0
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 18:55  [ТС]
В задании сказано сделать страницу мои заказы. теперь БД выглядит вот так

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Order(models.Model):
    
    ...
 
    nickname = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
   
    
    ...
 
    class Meta:
        ordering = ('-created',)
        verbose_name = 'Заказ'
        verbose_name_plural = 'Заказы'
 
    def __str__(self):
        return 'Order {}'.format(self.id)
 
    def get_total_cost(self):
        return sum(item.get_cost() for item in self.items.all())
Добавил поле product.

В forms по аналогии с nickname прописал

Code
1
2
3
4
5
if form.is_valid():
            order = form.save(commit=False)
            order.nickname = request.user
            order.product = request.product
            order.save()
Добавил
Code
1
order.product = request.product


и во views прописано так

Code
1
2
3
4
5
6
7
8
9
10
11
12
def my_orders(request):
    
    ...    
             
    product = OrderItem.objects.filter(product = request.name)
    
   
    assert isinstance(request, HttpRequest)
    return render(
        request,
        'app/my_orders.html', {'product': product}
         )
НО название продукта не выводится в шаблоне

хотя там прописан цикл for

Code
1
2
3
 {% for item_1 in product %}
    {{item_1}}
    {% endfor %}
Натолкните на решение пожалуйста
0
21 / 12 / 9
Регистрация: 12.02.2020
Сообщений: 126
18.11.2020, 19:25
OlegFedotov, оно и не будет работать.
Про request.product забудь, и никогда так не пиши, а еще лучше почитай https://django.fun/docs/django... -response/
order.product = request.product - тут тоже какая-то чепуха. У тебя в модели Order отсутствует "product", а про request.product тоже забудь.
product = OrderItem.objects.filter(product = request.name) - тоже что-то непонятное.
Вообще что хранится в OrderItem, для чего нужна эта модель?
Логично, что на странице Мои заказы, должны быть заказы, соответственно и обращаться нужно к модели Order
Например,
Python
1
product = Order.objects.filter(nickname = request.user)
А в шаблоне циклом выводить список заказов
{% for item_1 in product %}
{{item_1.id}}
{% endfor %}
0
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 19:33  [ТС]
1)То есть в views не писать
Code
1
[B] order.product = request.product[/B]
2) в модель Order добавил поле Product
Code
1
product = models.ForeignKey(Product, on_delete=models.CASCADE)
3) можно создать такую переменную по аналогии с
Code
1
product = Order.objects.filter(nickname = request.user)
переменна будет выглядеть так
Code
1
orders = Order.objects.filter(product=request.product)
0
21 / 12 / 9
Регистрация: 12.02.2020
Сообщений: 126
18.11.2020, 19:39
Цитата Сообщение от OlegFedotov Посмотреть сообщение
1)То есть в views не писать
Нет, нужно в переменную записать определенный товар
Цитата Сообщение от OlegFedotov Посмотреть сообщение
переменна будет выглядеть так
про request.product забыть НАВСЕГДА
0
1 / 1 / 1
Регистрация: 06.03.2020
Сообщений: 56
18.11.2020, 19:51  [ТС]
"Нет, нужно в переменную записать определенный товар"

если определенный , значит нужно использовать ID

order.product = product.id

В теме очень сильно плаваю. Может скажете где информацию искать, пожалуйста.

Добавлено через 7 минут
Code
1
product = Order.objects.filter(product=product__id)
Додумываюсь только до этого, конечно это неверно
0
21 / 12 / 9
Регистрация: 12.02.2020
Сообщений: 126
18.11.2020, 19:54
Цитата Сообщение от OlegFedotov Посмотреть сообщение
product.id
нужно еще определить.
Наверное, покупатель будет заказывать перейдя на какой-то товар, соответственно ссылка будет иметь id, либо еще какие-то данные.
Python
1
2
def product_detail(request, id):
     product  = get_object_or_404(Product, pk=id)
Цитата Сообщение от OlegFedotov Посмотреть сообщение
В теме очень сильно плаваю. Может скажете где информацию искать, пожалуйста.
информации в интернете полно

Добавлено через 1 минуту
OlegFedotov, советую почитать книгу А.Меле «Django 2 в примерах»
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2020, 19:54
Помогаю со студенческими работами здесь

Очистить историю подключений USB-flash и историю браузера
Привет, форумчане! Подскажите, где хранится инфа об: 1. Подключенные устройства чререз USB (флешки и .т.п.); 2. История серфинга...

Вывести историю платежей студентов
мне надо вывести историю платежей студентов

Вывести историю операций банкомата
Добрый день! Добрый день! Банкомат выполняет следующие операции по снятию и переводу денег. Есть класс Cards и наследники: Credit и...

Вывести историю по всем адресам либо по выбранному.
Может кто-нибудь знает что я делаю не так. Нужно вывести историю по всем адресам либо по выбранному. ...

Получите список номеров торговых представителей, количество обработанных ими заказов, а также общую сумму этих заказов
Получите список номеров торговых представителей, количество обработанных ими заказов, а также общую сумму этих заказов Таблицы ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru