티스토리 뷰

Template 확장

입력 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">견&nbsp;&nbsp;적&nbsp;&nbsp;서</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>

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함