Как на Python&Django отобразить количество товаров.

Пикод

Новичок
Пользователь
Май 21, 2021
7
0
1
Добрый день! У меня создано таблица под названием PrixodTable . На странице url prixodosnovnisred добавляю в базу "товар" он сохраняется в таблице PrixodTable.Теперь мне нужно на основной странице отобразить количество товаров .Например: Принтеры-2шт,Мониторы-3шт т.п(скриншот:главнаястр). Как мне это реализовать ? Я так думаю через QuerySet. count() но чето не могу сообразить .
models.py
Python:
from django.db import models
from django.contrib.auth.models import User
class Prixodtable(models.Model):
    id = models.AutoField('ID', primary_key=True,null=False)
    name = models.CharField('Название основных средств', max_length=50)
    invert_numeric = models.IntegerField('Инвентарный номер')
    serial_numeric = models.CharField('Серийный номер', max_length=50)
    dog_id = models.IntegerField('Дог ID')
    tmcstatus_ID = models.IntegerField('ID статуса ТМЦ')
    status_row_ID = models.IntegerField('Статус записи')
    bastresurs_ID = models.IntegerField('ID устройства которому подходит', null=True,blank=True) # не обезательно поле для заполнения
    data_start = models.DateTimeField('Дата принятие на учет')
    data_end = models.DateTimeField('Дата списания', null=True, blank=True) # не обезательно поле для заполнения
    data_create = models.DateTimeField('Дата создания')
    avtor = models.ForeignKey(User, verbose_name='Автор', on_delete=models.SET_DEFAULT, default=None,) #После удаления автора записи данные который базу заносил автор остается

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Основные средства'
        verbose_name_plural = 'Основные средства'

forms.py
Python:
from .models import Prixodtable
from django.forms import ModelForm, TextInput, DateTimeInput

class PrixodtableForm(ModelForm):
    class Meta:
        model = Prixodtable
        fields = ['id', 'name', 'invert_numeric', 'serial_numeric', 'dog_id', 'tmcstatus_ID', 'status_row_ID', 'bastresurs_ID', 'data_start', 'data_create', 'avtor']

        widgets = {
            "id": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'ID',
            }),
            "name": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Название',
            }),
            "invert_numeric": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Инвентарный номер',
            }),
            "serial_numeric": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Серийный номер',
            }),
            "dog_id": TextInput(attrs={
                'class': 'form-control',
                'placeholder': '"№ Договора поставщика',
            }),
            "tmcstatus_ID": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'ID статуса ТМЦ',
            }),
            "status_row_ID": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Статус записи',
            }),
            "bastresurs_ID": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'ID устройства которому подходит',
            }),
            "data_start": DateTimeInput(attrs={
                'class': 'form-control',
                'placeholder': 'Дата принятие на учет',
            }),
            "data_create": DateTimeInput(attrs={
                'class': 'form-control',
                'placeholder': 'Дата создания',
            })
        }

главная страница
HTML:
{% extends 'main/layout.html' %}

{% block title %}
    Главная
{% endblock %}


{% block content %}
    <div class="page-header">
      <h3>Заголовок</h3>
    </div>
    <div class="container mt-2">
      <div class="row" id="block_1">
        <div class="col-md-3" id="block_2">
            <h6>Итоговое количество основных средств</h6>
            <dl>
                <dt>Принтер  1 шт</dt>
                <dt>Монитор 2 шт</dt>
            </dl>
        </div>
        <div class = "col-md-3" id="block_2">
            <h6>Итоговое количество расходных материалов</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
        <div class = "col-md-3" id="block_2">
            <h6>Итоговое количество утилизированного материала</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
        <div class = "col-md-3 col-sm-12" id="block_2">
            <h6>Итоговое количество списанного материала</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
      </div>
    </div>
{% endblock %}
 

Вложения

  • главнаястр.PNG
    главнаястр.PNG
    28,3 КБ · Просмотры: 7
  • 2к.PNG
    2к.PNG
    57 КБ · Просмотры: 7

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Как мне это реализовать ?
Можно так например:
Python:
# views.py

from django.shortcuts import render

from .models import Prixodtable


def prixods_count(request):
    prixods = Prixodtable.objects.all()
    # получаем все названия
    names = [p.name for p in prixods]
    # получаем список туплов [(название, количество), ...]
    res = [(n, names.count(n)) for n in set(names)]
    return render(request, 'main/main.html', {'res': res})


# template
{% extends 'main/layout.html' %}

{% block title %}
    Главная
{% endblock %}

{% block content %}
    <div class="page-header">
      <h3>Заголовок</h3>
    </div>
    <div class="container mt-2">
      <div class="row" id="block_1">
        <div class="col-md-3" id="block_2">
            <h6>Итоговое количество основных средств</h6>
            <dl>
                {% for name, count in res %}
                    <dt>{{ name }} {{ count }} шт</dt>
                {% endfor %}
            </dl>
        </div>
        <div class = "col-md-3" id="block_2">
            <h6>Итоговое количество расходных материалов</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
        <div class = "col-md-3" id="block_2">
            <h6>Итоговое количество утилизированного материала</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
        <div class = "col-md-3 col-sm-12" id="block_2">
            <h6>Итоговое количество списанного материала</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
      </div>
    </div>
{% endblock %}
или с помощью аннотации:
Python:
# view
from django.shortcuts import render
from django.db.models import Count

from .models import Prixodtable


def prixods_count(request):
    # получаем все названия
    res = Prixodtable.objects.values('name')
    # считаем количество каждого
    res = res.annotate(Count('id')).order_by()
    # получаем список туплов [(название, количество), ...]
    res = res.values_list('name', 'id__count')
    return render(request, 'main/main.html', {'res': res})
 
Последнее редактирование:
  • Мне нравится
Реакции: Пикод

Пикод

Новичок
Пользователь
Май 21, 2021
7
0
1
Можно так например:
Python:
# views.py

from django.shortcuts import render

from .models import Prixodtable


def prixods_count(request):
    prixods = Prixodtable.objects.all()
    # получаем все названия
    names = [p.name for p in prixods]
    # получаем список туплов [(название, количество), ...]
    res = [(n, names.count(n)) for n in set(names)]
    return render(request, 'main/main.html', {'res': res})


# template
{% extends 'main/layout.html' %}

{% block title %}
    Главная
{% endblock %}

{% block content %}
    <div class="page-header">
      <h3>Заголовок</h3>
    </div>
    <div class="container mt-2">
      <div class="row" id="block_1">
        <div class="col-md-3" id="block_2">
            <h6>Итоговое количество основных средств</h6>
            <dl>
                {% for name, count in res %}
                    <dt>{{ name }} {{ count }} шт</dt>
                {% endfor %}
            </dl>
        </div>
        <div class = "col-md-3" id="block_2">
            <h6>Итоговое количество расходных материалов</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
        <div class = "col-md-3" id="block_2">
            <h6>Итоговое количество утилизированного материала</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
        <div class = "col-md-3 col-sm-12" id="block_2">
            <h6>Итоговое количество списанного материала</h6>
            <dl>
                <dt>ghjjkk</dt>
                <dt>ghjjkk</dt>
            </dl>
        </div>
      </div>
    </div>
{% endblock %}
или с помощью аннотации:
Python:
# view
from django.shortcuts import render
from django.db.models import Count

from .models import Prixodtable


def prixods_count(request):
    # получаем все названия
    res = Prixodtable.objects.values('name')
    # считаем количество каждого
    res = res.annotate(Count('id')).order_by()
    # получаем список туплов [(название, количество), ...]
    res = res.values_list('name', 'id__count')
    return render(request, 'main/main.html', {'res': res})


Спасибо за ответ. Оба способа почему то словарь в шаблоне не видно. Пустая страница и ошибок нету вообще. Как будто словарь пустой но в базе есть данные
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Как будто словарь пустой но в базе есть данные
Можете вывести значение словаря в консоль чтобы узнать что передается в шаблон. Также проверьте имя шаблона во вьюхе.
 
  • Мне нравится
Реакции: Пикод

Пикод

Новичок
Пользователь
Май 21, 2021
7
0
1
Можете вывести значение словаря в консоль чтобы узнать что передается в шаблон. Также проверьте имя шаблона во вьюхе.
Спасибо большое ваш код сработал! Решение было под глазами в templates НЕ
'main/main.html', {'res': res} а надо было указать где сам каталог был
Python:
'prixod/prixods_count.html', {'res': res}
 

Форум IT Специалистов