initial commit
This commit is contained in:
3
.directory
Normal file
3
.directory
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[Dolphin]
|
||||||
|
Timestamp=2015,4,13,16,48,17
|
||||||
|
Version=3
|
||||||
0
asuzr/__init__.py
Normal file
0
asuzr/__init__.py
Normal file
BIN
asuzr/__init__.pyc
Normal file
BIN
asuzr/__init__.pyc
Normal file
Binary file not shown.
24
asuzr/admin.py
Normal file
24
asuzr/admin.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from asuzr.models import Product
|
||||||
|
from asuzr.models import Order
|
||||||
|
from asuzr.models import Sketch
|
||||||
|
from asuzr.models import Action
|
||||||
|
from asuzr.models import ProdPlan
|
||||||
|
from asuzr.models import AccessProtocol
|
||||||
|
from asuzr.models import OrderPlan
|
||||||
|
from asuzr.models import Attendance
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
#admin.site.register(Product)
|
||||||
|
class ProductAdmin(admin.ModelAdmin):
|
||||||
|
list_display=('name', 'prod_period')
|
||||||
|
admin.site.register(Product, ProductAdmin)
|
||||||
|
admin.site.register(Order)
|
||||||
|
admin.site.register(Sketch)
|
||||||
|
admin.site.register(Action)
|
||||||
|
admin.site.register(ProdPlan)
|
||||||
|
admin.site.register(AccessProtocol)
|
||||||
|
admin.site.register(OrderPlan)
|
||||||
|
class AttendAdmin(admin.ModelAdmin):
|
||||||
|
list_display=('date', 'calls', 'visits')
|
||||||
|
admin.site.register(Attendance, AttendAdmin)
|
||||||
BIN
asuzr/admin.pyc
Normal file
BIN
asuzr/admin.pyc
Normal file
Binary file not shown.
101
asuzr/models.py
Normal file
101
asuzr/models.py
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
#Соответствие названий и номеров дней недели
|
||||||
|
class Common:
|
||||||
|
day_names = ("Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье")
|
||||||
|
day_colors = ("FFFFFF","FFFFFF","FFFFFF","FFFFFF","FFFFFF","#FFE4E1", "#FFE4E1")
|
||||||
|
|
||||||
|
#Изделия
|
||||||
|
class Product(models.Model):
|
||||||
|
name = models.CharField(max_length=150)
|
||||||
|
prod_period = models.IntegerField()#трудоемкость, дней
|
||||||
|
|
||||||
|
#Таблица посещаемости
|
||||||
|
class Attendance(models.Model):
|
||||||
|
date = models.DateField()
|
||||||
|
calls = models.IntegerField()
|
||||||
|
visits = models.IntegerField()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def date_dd_mm_yy(self):
|
||||||
|
return self.date.strftime("%d/%m/%y")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def week_day(self):
|
||||||
|
day_number = self.date.weekday()
|
||||||
|
day_name = Common.day_names[day_number]
|
||||||
|
return day_name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def day_color(self):
|
||||||
|
day_number = self.date.weekday()
|
||||||
|
color = Common.day_colors[day_number]
|
||||||
|
return color
|
||||||
|
|
||||||
|
@property
|
||||||
|
def order_count(self):
|
||||||
|
return Order.objects.filter(date=self.date).count()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def orders_price(self):
|
||||||
|
orders = Order.objects.filter(date=self.date)
|
||||||
|
day_price = sum(o.price for o in orders)
|
||||||
|
return day_price
|
||||||
|
|
||||||
|
|
||||||
|
#Заказы
|
||||||
|
class Order(models.Model):
|
||||||
|
date = models.DateField() #дата
|
||||||
|
product = models.ForeignKey(Product) #id изделия
|
||||||
|
price = models.DecimalField(max_digits=12, decimal_places=2) #стоимость
|
||||||
|
address = models.CharField(max_length=150) #адрес
|
||||||
|
designer = models.ForeignKey(User, related_name='+') #id дизайнера
|
||||||
|
deadline = models.DateField() #срок сдачи
|
||||||
|
delivery = models.BooleanField(default=False) #доставка
|
||||||
|
lifting = models.BooleanField(default=False) #подъем
|
||||||
|
paid = models.DecimalField(max_digits=12, decimal_places=2) #оплачено
|
||||||
|
approved = models.DateTimeField(null=True, blank = True) #согласовано
|
||||||
|
executor = models.ForeignKey(User, related_name='+') #id исполнителя
|
||||||
|
is_done = models.BooleanField(default=False) #сдан
|
||||||
|
calls = models.TextField(null=True, blank = True) #обзвон
|
||||||
|
contact = models.CharField(max_length=150, null=True, blank = True) #контактное лицо
|
||||||
|
phone_num = models.CharField(max_length=150,null=True, blank = True) #контактный телефон
|
||||||
|
cancelled = models.BooleanField(default=False) #отменен
|
||||||
|
|
||||||
|
@property
|
||||||
|
def deadline_dmy(self):
|
||||||
|
return self.deadline.strftime("%d/%m/%y")
|
||||||
|
|
||||||
|
#Эскизы
|
||||||
|
class Sketch(models.Model):
|
||||||
|
file_name = models.CharField(max_length=150) #имя файла
|
||||||
|
file_path = models.CharField(max_length=150) #путь к файу
|
||||||
|
order = models.ForeignKey(Order) #id заказа
|
||||||
|
|
||||||
|
#Действия
|
||||||
|
class Action(models.Model):
|
||||||
|
name = models.CharField(max_length=150) #наименование действия
|
||||||
|
|
||||||
|
#Производственный план
|
||||||
|
class ProdPlan(models.Model):
|
||||||
|
start_date = models.DateField() #дата начала
|
||||||
|
end_date = models.DateField() #дата окончания
|
||||||
|
order = models.ForeignKey(Order) #id заказа
|
||||||
|
executor = models.ForeignKey(User) #id исполнителя
|
||||||
|
action = models.ForeignKey(Action) #id действия
|
||||||
|
|
||||||
|
#Протокол доступа
|
||||||
|
class AccessProtocol(models.Model):
|
||||||
|
time = models.DateTimeField() #время
|
||||||
|
user = models.ForeignKey(User) #id пользователя
|
||||||
|
event = models.CharField(max_length=150) #действие
|
||||||
|
|
||||||
|
#План заказов
|
||||||
|
class OrderPlan(models.Model):
|
||||||
|
month = models.DateField()
|
||||||
|
plan = models.IntegerField()
|
||||||
BIN
asuzr/models.pyc
Normal file
BIN
asuzr/models.pyc
Normal file
Binary file not shown.
3
asuzr/tests.py
Normal file
3
asuzr/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
96
asuzr/views.py
Normal file
96
asuzr/views.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpResponse
|
||||||
|
from django.template import Context, loader
|
||||||
|
from asuzr.models import Product
|
||||||
|
from asuzr.models import Attendance
|
||||||
|
from asuzr.models import Order
|
||||||
|
from datetime import datetime, date, time
|
||||||
|
# Create your views here.
|
||||||
|
|
||||||
|
def prod_list(request):
|
||||||
|
product_list = Product.objects.all()
|
||||||
|
t = loader.get_template('asuzr/prod_list.html')
|
||||||
|
c = Context({
|
||||||
|
'product_list': product_list,
|
||||||
|
})
|
||||||
|
return HttpResponse(t.render(c))
|
||||||
|
|
||||||
|
def prod_detail(request, prod_id):
|
||||||
|
return HttpResponse("This is %s" % prod_id)
|
||||||
|
|
||||||
|
|
||||||
|
def attend_table(request, year, month):
|
||||||
|
attend_list = Attendance.objects.all().order_by('date')
|
||||||
|
filtered_list=[]
|
||||||
|
for a in attend_list:
|
||||||
|
a_date = a.date
|
||||||
|
if a_date.strftime('%m/%Y') == month+'/'+year:
|
||||||
|
filtered_list.append(a)
|
||||||
|
|
||||||
|
sum_calls = sum(l.calls for l in filtered_list)
|
||||||
|
sum_visits = sum(l.visits for l in filtered_list)
|
||||||
|
sum_orders = sum(l.order_count for l in filtered_list)
|
||||||
|
sum_price = sum(l.orders_price for l in filtered_list)
|
||||||
|
t = loader.get_template('asuzr/attendance.html')
|
||||||
|
c = Context({
|
||||||
|
'attend_list': filtered_list,
|
||||||
|
'sum_calls': sum_calls,
|
||||||
|
'sum_visits': sum_visits,
|
||||||
|
'sum_orders': sum_orders,
|
||||||
|
'sum_price': sum_price,
|
||||||
|
})
|
||||||
|
return HttpResponse(t.render(c))
|
||||||
|
|
||||||
|
def orders_table(request, year, month, day):
|
||||||
|
p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y')
|
||||||
|
order_list = Order.objects.filter(date=p_date).order_by('id')
|
||||||
|
sum_price = sum(l.price for l in order_list)
|
||||||
|
t = loader.get_template('asuzr/orders.html')
|
||||||
|
c = Context({
|
||||||
|
'order_list': order_list,
|
||||||
|
'sum_price': sum_price,
|
||||||
|
})
|
||||||
|
return HttpResponse(t.render(c))
|
||||||
|
|
||||||
|
def get_filtered_list(p_list, year, month):
|
||||||
|
filtered_list=[]
|
||||||
|
for a in p_list:
|
||||||
|
a_date = a.date
|
||||||
|
if a_date.strftime('%m/%Y') == month+'/'+year:
|
||||||
|
filtered_list.append(a)
|
||||||
|
|
||||||
|
return filtered_list
|
||||||
|
|
||||||
|
def get_orders_by_date(dt):
|
||||||
|
order_list = Order.objects.filter(date=dt).order_by('id')
|
||||||
|
return order_list
|
||||||
|
|
||||||
|
def attend_order_table(request, year, month):
|
||||||
|
attend_list = Attendance.objects.all().order_by('date')
|
||||||
|
filtered_attend_list=get_filtered_list(attend_list, year, month)
|
||||||
|
|
||||||
|
order_list = Order.objects.all().order_by('id')
|
||||||
|
filtered_order_list = get_filtered_list(order_list, year, month)
|
||||||
|
|
||||||
|
sum_calls = sum(l.calls for l in filtered_attend_list)
|
||||||
|
sum_visits = sum(l.visits for l in filtered_attend_list)
|
||||||
|
sum_orders = sum(l.order_count for l in filtered_attend_list)
|
||||||
|
sum_price = sum(l.orders_price for l in filtered_attend_list)
|
||||||
|
|
||||||
|
sum_order_price = sum(l.price for l in filtered_order_list)
|
||||||
|
|
||||||
|
t = loader.get_template('asuzr/attend_order.html')
|
||||||
|
c = Context({
|
||||||
|
'attend_list': filtered_attend_list,
|
||||||
|
'order_list': filtered_order_list,
|
||||||
|
'sum_calls': sum_calls,
|
||||||
|
'sum_visits': sum_visits,
|
||||||
|
'sum_orders': sum_orders,
|
||||||
|
'sum_price': sum_price,
|
||||||
|
'sum_order_price': sum_order_price,
|
||||||
|
})
|
||||||
|
return HttpResponse(t.render(c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
asuzr/views.pyc
Normal file
BIN
asuzr/views.pyc
Normal file
Binary file not shown.
0
record/__init__.py
Normal file
0
record/__init__.py
Normal file
BIN
record/__init__.pyc
Normal file
BIN
record/__init__.pyc
Normal file
Binary file not shown.
85
record/settings.py
Normal file
85
record/settings.py
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
"""
|
||||||
|
Django settings for record project.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/1.6/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/1.6/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
|
import os
|
||||||
|
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production
|
||||||
|
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = ')-s&c_)jnmzoslf=9rnav9qqadd#l$46jt+m51ppu!lril3g89'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
TEMPLATE_DEBUG = True
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = []
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = (
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'asuzr'
|
||||||
|
)
|
||||||
|
|
||||||
|
MIDDLEWARE_CLASSES = (
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
)
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'record.urls'
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'record.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/1.6/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'Asia/Yekaterinburg'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_L10N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/1.6/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
TEMPLATE_DIRS = ('/home/anastasia/projects/django/record/templates/')
|
||||||
BIN
record/settings.pyc
Normal file
BIN
record/settings.pyc
Normal file
Binary file not shown.
16
record/urls.py
Normal file
16
record/urls.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from django.conf.urls import patterns, include, url
|
||||||
|
|
||||||
|
from django.contrib import admin
|
||||||
|
admin.autodiscover()
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
# Examples:
|
||||||
|
# url(r'^$', 'record.views.home', name='home'),
|
||||||
|
# url(r'^blog/', include('blog.urls')),
|
||||||
|
url(r'^product/$', 'asuzr.views.prod_list'),
|
||||||
|
url(r'^product/(?P<prod_id>\d+)/$', 'asuzr.views.prod_detail'),
|
||||||
|
url(r'^attendance/(?P<year>\d+)/(?P<month>\d+)/$', 'asuzr.views.attend_table'),
|
||||||
|
url(r'^orders/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)/$', 'asuzr.views.orders_table'),
|
||||||
|
url(r'^attend_order/(?P<year>\d+)/(?P<month>\d+)/$', 'asuzr.views.attend_order_table'),
|
||||||
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
|
)
|
||||||
BIN
record/urls.pyc
Normal file
BIN
record/urls.pyc
Normal file
Binary file not shown.
14
record/wsgi.py
Normal file
14
record/wsgi.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for record project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "record.settings")
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
application = get_wsgi_application()
|
||||||
BIN
record/wsgi.pyc
Normal file
BIN
record/wsgi.pyc
Normal file
Binary file not shown.
10
templates/admin/base_site.html
Normal file
10
templates/admin/base_site.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "admin/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
|
||||||
|
|
||||||
|
{% block branding %}
|
||||||
|
<h1 id="site-name">{% trans 'Автоматизированная система учета заказов студии мебели Рекорд' %}</h1>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block nav-global %}{% endblock %}
|
||||||
2
templates/asuzr/attend_order.html
Normal file
2
templates/asuzr/attend_order.html
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
{% include 'asuzr/attendance.html' %}
|
||||||
|
{% include 'asuzr/orders.html' %}
|
||||||
43
templates/asuzr/attendance.html
Normal file
43
templates/asuzr/attendance.html
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Таблица посещаемости</title>
|
||||||
|
<meta content="">
|
||||||
|
<style></style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<H1>Таблица посещаемости</H1>
|
||||||
|
<TABLE BORDER WIDTH="100%">
|
||||||
|
{% if attend_list %}
|
||||||
|
<ul>
|
||||||
|
<TR>
|
||||||
|
<TH>Дата</TH>
|
||||||
|
<TH>День недели</TH>
|
||||||
|
<TH>Звонки</TH>
|
||||||
|
<TH>Посещения</TH>
|
||||||
|
<TH>Заказы</TH>
|
||||||
|
<TH>Стоимость</TH>
|
||||||
|
</TR>
|
||||||
|
{% for attend in attend_list %}
|
||||||
|
<TR bgcolor={{attend.day_color}}>
|
||||||
|
<TD>{{ attend.date_dd_mm_yy}}</TD>
|
||||||
|
<TD>{{ attend.week_day}}</TD>
|
||||||
|
<TD>{{ attend.calls }}</TD>
|
||||||
|
<TD>{{ attend.visits }}</TD>
|
||||||
|
<TD>{{ attend.order_count}}</TD>
|
||||||
|
<TD>{{ attend.orders_price}}</TD>
|
||||||
|
</TR>
|
||||||
|
{% endfor %}
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN=2>ИТОГО:</TD>
|
||||||
|
<TD>{{sum_calls}}</TD>
|
||||||
|
<TD>{{sum_visits}}</TD>
|
||||||
|
<TD>{{sum_orders}}</TD>
|
||||||
|
<TD>{{sum_price}}</TD>
|
||||||
|
</TR>
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>Список изделий пуст</p>
|
||||||
|
{% endif %}
|
||||||
|
</TABLE>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
41
templates/asuzr/orders.html
Normal file
41
templates/asuzr/orders.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Заказы</title>
|
||||||
|
<meta content="">
|
||||||
|
<style></style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<H1>Заказы</H1>
|
||||||
|
<TABLE BORDER WIDTH="100%">
|
||||||
|
{% if order_list %}
|
||||||
|
<ul>
|
||||||
|
<TR>
|
||||||
|
<TH>Наименование</TH>
|
||||||
|
<TH>Стоимость</TH>
|
||||||
|
<TH>Адрес</TH>
|
||||||
|
<TH>Дизайнер</TH>
|
||||||
|
<TH>Срок сдачи</TH>
|
||||||
|
</TR>
|
||||||
|
{% for order in order_list %}
|
||||||
|
<TR>
|
||||||
|
<TD>{{ order.product.name }}</TD>
|
||||||
|
<TD>{{ order.price }}</TD>
|
||||||
|
<TD>{{ order.address }}</TD>
|
||||||
|
<TD>{{ order.designer.first_name }}</TD>
|
||||||
|
<TD>{{ order.deadline_dmy }}</TD>
|
||||||
|
</TR>
|
||||||
|
{% endfor %}
|
||||||
|
<TR>
|
||||||
|
<TD> ИТОГО:</TD>
|
||||||
|
<TD>{{sum_price}}</TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p> Список заказов пуст</p>
|
||||||
|
{% endif %}
|
||||||
|
</TABLE>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
18
templates/asuzr/prod_list.html
Normal file
18
templates/asuzr/prod_list.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Типы изделий</title>
|
||||||
|
<meta content="">
|
||||||
|
<style></style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% if product_list %}
|
||||||
|
<ul>
|
||||||
|
{% for prod in product_list %}
|
||||||
|
<li>{{ prod.name }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>Список изделий пуст</p>
|
||||||
|
{% endif %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user