티스토리 뷰
(macOS)[python][django][RaspberryPi] ERP platform - 5 : sales
jinozpersona 2021. 5. 31. 16:43Template 확장
입력 form 만들기
새글 쓰기/수정/삭제
Server Test : git transmission : 생략
INTRO
* local / server terminal 구분 : [macOS] / [Raspi]
** venv 표기 : (pyERP)
Raspi : server
- Python : 3.7.3
- django : 3.2
macOS : local-dev
- Python : 3.9.4
- django : 3.2
-------------------- platform review --------------------
구성 : head / navbar_main / body_top / navbar_sub / body_bottom / footer
프레임(상단) : index_sales
프레임(하단) : index_sales_detail
영업관리 클릭 : index_sales 이동
새글쓰기 클릭 : sales_new 이동
품명 클릭 : index_sales_detail 이동
수정 클릭 : sales_edit 이동
견적서출력 Go! 클릭 : 새탭열기
-------------------- platform review --------------------
1. home: notice
2. sales
다음과 같이 models/forms/urls/views/templates로 구성
--> models, forms, (admin), urls, views, templates(sales)
3. production
@ macOS
sales
- models
{SublimeText}sales/models.py
from django.conf import settings
from django.db import models
class Sales(models.Model):
sales_id = models.AutoField(primary_key=True)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
company = models.CharField('Company', max_length=64, null=False)
site = models.CharField('Site', max_length=64, null=False)
customer = models.CharField('담당자', max_length=64, null=False)
category = models.CharField('제품구분', max_length=128, null=False)
item = models.CharField('품명', max_length=128, null=False)
quantity = models.IntegerField('수량', null=False)
dateShip = models.DateField('납품일', null=False)
drawID = models.CharField('DrawingID', max_length=128, null=True, blank=True)
frameID = models.CharField('FrameID', max_length=128, null=True, blank=True)
note = models.CharField('비고', max_length=128, null=True, blank=True)
created_at = models.DateTimeField('PO생성일',auto_now_add=True)
updated_at = models.DateTimeField('PO수정일',auto_now=True)
def __int__(self):
return self.sales_id
def __str__(self):
return self.item
- forms
{SublimeText}sales/forms.py
from django import forms
from sales.models import Sales
class SalesForm(forms.ModelForm):
class Meta:
model = Sales
fields = ['author', 'company' ,'site', 'customer', 'category', 'item', 'quantity', 'dateShip', 'drawID', 'frameID', 'note']
widgets = {
'company' : forms.TextInput(attrs={'style':'width: 4em'}),
'site' : forms.TextInput(attrs={'style':'width: 3em'}),
'customer' : forms.TextInput(attrs={'style':'width: 4em'}),
'category' : forms.TextInput(attrs={'style':'width: 4em'}),
'item' : forms.TextInput(attrs={'style':'width: 8em'}),
'quantity' : forms.NumberInput(attrs={'style':'width: 3em'}),
'dateShip' : forms.DateInput(attrs={'style':'width: 6em'}),
'drawID' : forms.TextInput(attrs={'style':'width: 7em'}),
'frameID' : forms.TextInput(attrs={'style':'width: 7em'}),
'note' : forms.TextInput(attrs={'style':'width: 8em'}),
}
- admin
{SublimeText}sales/admin.py
from django.contrib import admin
from sales.models import Sales
class SalesAdmin(admin.ModelAdmin):
search_fields = ['item']
admin.site.register(Sales, SalesAdmin)
- urls
{SublimeText}sales/urls.py
from django.contrib import admin
from django.urls import path
from sales import views
urlpatterns = [
path('', views.index_sales, name='index_sales'),
path('<int:pk>/', views.index_sales_detail, name='index_sales_detail'),
path('new/', views.sales_new, name='sales_new'),
path('<int:pk>/edit/', views.sales_edit, name='sales_edit'),
path('<int:pk>/delete/', views.sales_delete, name='sales_delete'),
path('quotation/<int:pk>/', views.quotation, name='quotation'),
]
- views
{SublimeText}sales/views.py
from django.shortcuts import render, redirect
from sales.models import Sales
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from sales.forms import SalesForm
@login_required
def index_sales(request):
saleses = Sales.objects.all().order_by('-sales_id')
return render(request, 'index_sales.html', {'saleses': saleses})
@login_required
def index_sales_detail(request, pk):
saleses = Sales.objects.all().order_by('-sales_id')
sales_view = Sales.objects.get(pk=pk)
context = {'saleses': saleses, 'sales_view': sales_view}
return render(request, 'index_sales_detail.html', context)
@login_required
def sales_new(request):
saleses = Sales.objects.all().order_by('-sales_id')
if request.method == 'POST':
form = SalesForm(request.POST)
if form.is_valid():
sales = Sales()
sales.author = form.cleaned_data['author']
sales.company = form.cleaned_data['company']
sales.site = form.cleaned_data['site']
sales.customer = form.cleaned_data['customer']
sales.category = form.cleaned_data['category']
sales.item = form.cleaned_data['item']
sales.quantity = form.cleaned_data['quantity']
sales.dateShip = form.cleaned_data['dateShip']
sales.drawID = form.cleaned_data['drawID']
sales.frameID = form.cleaned_data['frameID']
sales.note = form.cleaned_data['note']
sales.save()
return redirect('/sales/')
else:
form = SalesForm()
pass
return render(request, 'sales_new.html', {'form':form, 'saleses':saleses})
@login_required
def sales_delete(request, pk):
sales_del = Sales.objects.get(pk=pk)
if sales_del.author == User.objects.get(username = request.user.get_username()):
sales_del.delete()
return redirect('/sales/')
else:
return render(request, 'warning.html')
@login_required
def sales_edit(request, pk):
saleses = Sales.objects.all().order_by('-sales_id')
sales_edit = Sales.objects.get(pk=pk)
if request.method == 'POST':
form = SalesForm(request.POST)
if form.is_valid():
sales_edit.author = form.cleaned_data['author']
sales_edit.company = form.cleaned_data['company']
sales_edit.site = form.cleaned_data['site']
sales_edit.customer = form.cleaned_data['customer']
sales_edit.category = form.cleaned_data['category']
sales_edit.item = form.cleaned_data['item']
sales_edit.quantity = form.cleaned_data['quantity']
sales_edit.dateShip = form.cleaned_data['dateShip']
sales_edit.drawID = form.cleaned_data['drawID']
sales_edit.frameID = form.cleaned_data['frameID']
sales_edit.note = form.cleaned_data['note']
sales_edit.save()
return redirect('/sales/')
else:
form = SalesForm()
pass
return render(request, 'sales_edit.html', {'form':form, 'saleses':saleses})
@login_required
def quotation(request, pk):
quot = Sales.objects.get(pk=pk)
return render(request, 'quotation.html', {'quot':quot})
- templates
{SublimeText}sales/templates/index_sales.html
{% extends 'base.html' %}
<!--navbar_top -->
{% block navbar_top %}
{% include "navbar_main.html" %}
{% include "navbar_sales.html" %}
{% endblock %}
<!-- Main block -->
{% block content1 %}
<h2>영업관리 리스트</h2>
<table>
<thead>
<tr>
<td><B>수주번호</B></td>
<td><B>Company</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>납품수량</B></td>
<td><B>납품일</B></td>
<td><B>작성일</B></td>
<td><B>견적서출력</B></td>
</tr>
</thead>
<tbody>
{% for sales in saleses %}
<tr>
<td>{{ sales.sales_id }}</td>
<td>{{ sales.company }}</td>
<td>{{ sales.category }}</td>
<td><a href="{% url 'index_sales_detail' sales.pk %}">{{ sales.item }}</a></td>
<td>{{ sales.quantity }}</td>
<td>{{ sales.dateShip }}</td>
<td>{{ sales.created_at }}</td>
<td><a href="{% url 'quotation' sales.pk %}" target='_blank'>Go!</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- End Main block -->
<!--navbar_sub -->
{% block navbar_sub %}
{% include "navbar_new.html" %}
{% endblock %}
<!-- Sub block -->
{% block content2 %}
{% endblock %}
<!-- End Sub block -->
{SublimeText}sales/templates/index_sales_detail.html
{% extends 'base.html' %}
<!--navbar_top -->
{% block navbar_top %}
{% include "navbar_main.html" %}
{% include "navbar_sales.html" %}
{% endblock %}
<!-- Main block -->
{% block content1 %}
<h2>영업관리 리스트</h2>
<table>
<thead>
<tr>
<td><B>수주번호</B></td>
<td><B>Company</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>납품수량</B></td>
<td><B>납품일</B></td>
<td><B>작성일</B></td>
<td><B>견적서출력</B></td>
</tr>
</thead>
<tbody>
{% for sales in saleses %}
<tr>
<td>{{ sales.sales_id }}</td>
<td>{{ sales.company }}</td>
<td>{{ sales.category }}</td>
<td><a href="{% url 'index_sales_detail' sales.pk %}">{{ sales.item }}</a></td>
<td>{{ sales.quantity }}</td>
<td>{{ sales.dateShip }}</td>
<td>{{ sales.created_at }}</td>
<td><a href="{% url 'quotation' sales.pk %}" target='_blank'>Go!</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- End Main block -->
<!--navbar_sub -->
{% block navbar_sub %}
{% include "navbar_sub.html" %}
{% endblock %}
<!-- Sub block -->
{% block content2 %}
<h3>영업정보</h3>
<table>
<thead>
<tr>
<td><B>No.</B></td>
<td><B>영업담당자</B></td>
<td><B>고객사</B></td>
<td><B>Fab-Site</B></td>
<td><B>고객명</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>수량</B></td>
<td><B>납품일</B></td>
<td><B>DrawingID</B></td>
<td><B>AssemblyID</B></td>
<td><B>비고</B></td>
<td><B>작성일</B></td>
<td><B>수정일</B></td>
</tr>
</thead>
<tbody>
<tr>
<td>{{ sales_view.sales_id }}</td>
<td>{{ sales_view.author }}</td>
<td>{{ sales_view.company }}</td>
<td>{{ sales_view.site }}</td>
<td>{{ sales_view.customer }}</td>
<td>{{ sales_view.category }}</td>
<td>{{ sales_view.item }}</td>
<td>{{ sales_view.quantity }}</td>
<td>{{ sales_view.dateShip }}</td>
<td>{{ sales_view.drawID }}</td>
<td>{{ sales_view.frameID }}</td>
<td>{{ sales_view.note }}</td>
<td>{{ sales_view.created_at }}</td>
<td>{{ sales_view.updated_at }}</td>
</tr>
</tbody>
</table>
<h3>소재정보</h3>
<table>
<thead>
<tr>
<td><B>MTL No.</B></td>
<td><B>Maker</B></td>
<td><B>소재종류</B></td>
<td><B>두께</B></td>
<td><B>폭</B></td>
<td><B>길이</B></td>
<td><B>입고중량</B></td>
<td><B>잔량</B></td>
<td><B>단가</B></td>
<td><B>입고일</B></td>
<td><B>위치</B></td>
<td><B>성적서</B></td>
<td><B>특이사항</B></td>
</tr>
</thead>
<tbody>
<tr>
<td>List-up</td>
</tr>
</tbody>
</table>
<h3>생산이력</h3>
<table>
<thead>
<tr>
<td><B>수입검사여부</B></td>
<td><B>관리번호</B></td>
<td><B>품명</B></td>
<td><B>생산일</B></td>
<td><B>생산특이사항</B></td>
<td><B>품질특이사항</B></td>
<td><B>출하특이사항</B></td>
<td><B>고객특이사항</B></td>
</tr>
</thead>
<tbody>
<tr>
<td>List-up</td>
</tr>
</tbody>
</table>
{% endblock %}
{SublimeText}sales/templates/sales_edit.html
{% extends 'base.html' %}
<!--navbar_top -->
{% block navbar_top %}
{% include "navbar_main.html" %}
{% include "navbar_sales.html" %}
{% endblock %}
<!-- Main block -->
{% block content1 %}
<h2>영업관리 리스트</h2>
<table>
<thead>
<tr>
<td><B>수주번호</B></td>
<td><B>Company</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>납품수량</B></td>
<td><B>납품일</B></td>
<td><B>작성일</B></td>
<td><B>견적서출력</B></td>
</tr>
</thead>
<tbody>
{% for sales in saleses %}
<tr>
<td>{{ sales.sales_id }}</td>
<td>{{ sales.company }}</td>
<td>{{ sales.category }}</td>
<td><a href="{% url 'index_sales_detail' sales.pk %}">{{ sales.item }}</a></td>
<td>{{ sales.quantity }}</td>
<td>{{ sales.dateShip }}</td>
<td>{{ sales.created_at }}</td>
<td><a href="{% url 'quotation' sales.pk %}" target='_blank'>Go!</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- End Main block -->
<!--navbar_sub -->
{% block navbar_sub %}
{% include "navbar_sub.html" %}
{% endblock %}
<!-- Sub block -->
{% block content2 %}
<h2>수정하기</h2>
<table>
<thead>
<tr>
<td><B>영업담당자</B></td>
<td><B>고객사</B></td>
<td><B>Fab-Site</B></td>
<td><B>고객명</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>수량</B></td>
<td><B>납품일</B></td>
<td><B>DrawingID</B></td>
<td><B>AssemblyID</B></td>
<td><B>비고</B></td>
</tr>
</thead>
<tbody>
<tr>
<form method="post">
{% csrf_token %}
{% for form_td in form %}
<td>{{ form_td }}</td>
{% endfor %}
<a href="{% url 'index_sales' %}"><button type="submit">수정</button></a>
</form>
</tr>
</tbody>
</table>
{% endblock %}
{SublimeText}sales/templates/sales_new.html
{% extends 'base.html' %}
<!--navbar_top -->
{% block navbar_top %}
{% include "navbar_main.html" %}
{% include "navbar_sales.html" %}
{% endblock %}
<!-- Main block -->
{% block content1 %}
<h2>영업관리 리스트</h2>
<table>
<thead>
<tr>
<td><B>수주번호</B></td>
<td><B>Company</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>납품수량</B></td>
<td><B>납품일</B></td>
<td><B>작성일</B></td>
<td><B>견적서출력</B></td>
</tr>
</thead>
<tbody>
{% for sales in saleses %}
<tr>
<td>{{ sales.sales_id }}</td>
<td>{{ sales.company }}</td>
<td>{{ sales.category }}</td>
<td><a href="{% url 'index_sales_detail' sales.pk %}">{{ sales.item }}</a></td>
<td>{{ sales.quantity }}</td>
<td>{{ sales.dateShip }}</td>
<td>{{ sales.created_at }}</td>
<td><a href="{% url 'quotation' sales.pk %}" target='_blank'>Go!</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- End Main block -->
<!--navbar_sub -->
{% block navbar_sub %}
{% include "navbar_sub.html" %}
{% endblock %}
<!-- Sub block -->
{% block content2 %}
<h2>새글작성하기</h2>
<table>
<thead>
<tr>
<td><B>영업담당자</B></td>
<td><B>고객사</B></td>
<td><B>Fab-Site</B></td>
<td><B>고객명</B></td>
<td><B>제품구분</B></td>
<td><B>품명</B></td>
<td><B>수량</B></td>
<td><B>납품일</B></td>
<td><B>DrawingID</B></td>
<td><B>AssemblyID</B></td>
<td><B>비고</B></td>
</tr>
</thead>
<tbody>
<tr>
<form method="post">
{% csrf_token %}
{% for form_td in form %}
<td>{{ form_td }}</td>
{% endfor %}
<a href="{% url 'index_sales' %}"><button type="submit">생성</button></a>
</form>
</tr>
</tbody>
</table>
{% endblock %}
{SublimeText}sales/templates/quotation.html
{% load static %}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{{ section.title }}{% endblock %}</title>
<link rel="stylesheet" href="{% static 'css/style_home.css' %}">
</head>
<table class="tg" style="undefined;table-layout: fixed; width: 800px">
<colgroup>
<col style="width: 50px">
<col style="width: 240px">
<col style="width: 70px">
<col style="width: 70px">
<col style="width: 70px">
<col style="width: 70px">
<col style="width: 70px">
<col style="width: 70px">
<col style="width: 70px">
<col style="width: 70px">
</colgroup>
<thead>
<tr>
<th class="tg-jbyd" colspan="2" rowspan="2"><img src="{% static 'img/logo_w_persona.png' %}" width="140" height="38"></th>
<th class="tg-ymap" colspan="8" rowspan="2">견 적 서</th>
</tr>
<tr></tr>
</thead>
<tbody>
<tr>
<td class="tg-wp8o" colspan="3">{{quot.company}}</td>
<td class="tg-wp8o" colspan="2"></td>
<td class="tg-j4pq">상호</td>
<td class="tg-j4pq" colspan="4">PERSONA</td>
</tr>
<tr>
<td class="tg-wp8o" colspan="3">{{quot.customer}}</td>
<td class="tg-wp8o" colspan="2">귀중</td>
<td class="tg-j4pq">주소</td>
<td class="tg-j4pq" colspan="4">https://jinozblog.tistory.com/</td>
</tr>
<tr>
<td class="tg-73oq" colspan="5" rowspan="2">아래와 같이 견적합니다.</td>
<td class="tg-j4pq">업태</td>
<td class="tg-j4pq">제조</td>
<td class="tg-j4pq">종목</td>
<td class="tg-j4pq" colspan="2">Machine Parts</td>
</tr>
<tr>
<td class="tg-fm1z">연락처</td>
<td class="tg-fm1z" colspan="4">+82-10-0000-0000</td>
</tr>
<tr>
<td class="tg-73oq" colspan="10"></td>
</tr>
<tr>
<td class="tg-wp8o">No.</td>
<td class="tg-wp8o" colspan="2">Product</td>
<td class="tg-wp8o">Material</td>
<td class="tg-wp8o">Size</td>
<td class="tg-wp8o">Quantity</td>
<td class="tg-wp8o">Cost</td>
<td class="tg-wp8o">Sum</td>
<td class="tg-wp8o" colspan="2">Note</td>
</tr>
<tr>
<td class="tg-wp8o">1</td>
<td class="tg-wp8o" colspan="2">{{quot.item}}</td>
<td class="tg-wp8o">{{quot.category}}</td>
<td class="tg-wp8o">{{quot.layer}}</td>
<td class="tg-wp8o">{{quot.quantity}}</td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o" colspan="2"></td>
</tr>
<tr>
<td class="tg-wp8o">2</td>
<td class="tg-wp8o" colspan="2"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o" colspan="2"></td>
</tr>
<tr>
<td class="tg-wp8o">3</td>
<td class="tg-wp8o" colspan="2"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o" colspan="2"></td>
</tr>
<tr>
<td class="tg-wp8o">4</td>
<td class="tg-wp8o" colspan="2"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o" colspan="2"></td>
</tr>
<tr>
<td class="tg-wp8o">5</td>
<td class="tg-wp8o" colspan="2"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o"></td>
<td class="tg-wp8o" colspan="2"></td>
</tr>
<tr>
<td class="tg-wp8o" colspan="5">합계</td>
<td class="tg-73oq" colspan="5"></td>
</tr>
<tr>
<td class="tg-xwyw" rowspan="2" colspan="1">특이사항</td>
<td class="tg-73oq" colspan="9">VAT별도</td>
</tr>
<tr>
<td class="tg-73oq" colspan="9">대금지급 / 납기 별도 협의</td>
</tr>
</tbody>
</table>
</html>
'python > django_ERP1' 카테고리의 다른 글
(macOS)[python][django][RaspberryPi] ERP platform - 5 : production (0) | 2021.05.31 |
---|---|
(macOS)[python][django][RaspberryPi] ERP platform - 5 : home, notice (0) | 2021.05.13 |
(macOS)[python][django][RaspberryPi] ERP platform - 4 (0) | 2021.05.03 |
(macOS)[python][django][RaspberryPi] ERP platform - 3 (0) | 2021.04.23 |
(macOS)[python][django][RaspberryPi] ERP platform - 2 (0) | 2021.04.19 |
- Total
- Today
- Yesterday
- r
- 라즈베리파이
- 자가격리
- Model
- pyserial
- analysis
- vscode
- 코로나
- Raspberry Pi
- Pandas
- DAQ
- template
- 코로나19
- raspberrypi
- Django
- Templates
- github
- 확진
- Regression
- sublime text
- COVID-19
- MacOS
- server
- arduino
- Python
- SSH
- DS18B20
- git
- ERP
- CSV
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |