티스토리 뷰

register form

login/logout form

platform 정리

home : notice

sales app 추가

tapp app 제거

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 -------------------- 

browser : localhost:8000

login

sign-up

After Login

browser : localhost:8000/home

After Login : No. 1 click

browser : localhost:8000/home/1

영업관리 click

browser : localhost:8000/sales

영업관리 : No.1 click

browser : localhost:8000/sales/1

영업관리 : 견적서출력 Go! click --> 새창열기

browser : localhost:8000/sales/quotation/1

-------------------- platform review -------------------- 

 

 

 

가상환경 바로가기 만들기

testerp_venv.sh

#!/bin/bash

source /Users/[YourID]/.virtualenvs/pyERP/bin/activate
cd /Users/[YourID]/.virtualenvs/pyERP/testerp

 

[macOS]~$ source testerp_venv.sh

[macOS](pyERP)testerp$

 

 

macOS : local-dev1. platform 정리

[macOS](pyERP)testerp$ ./manage.py startapp sales

 

platform 정리 : models, DB등록, settings

models : home

{SublimeText} home/models.py

from django.db import models
from django.conf import settings


class Notice(models.Model):
	num_cnt    = models.IntegerField(primary_key=True)
	author     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
	title      = models.CharField('제목', max_length=128, null=True)
	article    = models.CharField('내용', max_length=128, null=True)
	date_pub   = models.DateField('작성일', null=True)
	cnt_view   = models.IntegerField('뷰', null=True)
	
	def __str__(self):
		return self.title

 

models : sales

{SublimeText} sales/models.py

from django.conf import settings
from django.db import models


class SalesData(models.Model):
	author     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
	num_cnt    = models.IntegerField(primary_key=True)
	company    = models.CharField('Company', max_length=128, null=False)
	site       = models.CharField('Site', max_length=128, null=False)
	customer   = models.CharField('담당자', max_length=128, 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=True)
	drawID     = models.CharField('DrawingID', max_length=128, null=True)
	frameID    = models.CharField('FrameID', max_length=128, null=True)
	note       = models.CharField('비고', max_length=128, null=True)
	
	def __str__(self):
		return self.item

 

 

DB등록

[macOS](pyERP)testerp$./manage.py makemigrations

[macOS](pyERP)testerp$./manage.py migrate

 

 

settings : Add app.

{SublimeText} config/settings.py

# Application definition

INSTALLED_APPS = [
    'sales.apps.SalesConfig',
    'home.apps.HomeConfig',
    # 'tapp',
    ....
]

....

LOGIN_REDIRECT_URL = '/home'
LOGOUT_REDIRECT_URL = '/'

 

platform 정리 : urls

urls : config/urls

{SublimeText} config/urls.py

from django.contrib import admin
from django.urls import path, include
# from tapp import urls
from home import urls, views
from sales import urls
from django.contrib.auth import views as auth_views
from django.views.generic import TemplateView


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', TemplateView.as_view(template_name='welcome.html'), name='welcome'),
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('signup/', views.signup, name='signup'),
    path('signup_waiting/', TemplateView.as_view(template_name='signup_waiting.html'), name='signup_waiting'),
    path('home/', include("home.urls")),
    path('sales/', include("sales.urls")),
    # path('tapp/', include("tapp.urls")),
]

 

urls : home/urls

{SublimeText} home/urls.py

from django.contrib import admin
from django.urls import path
from home import views


urlpatterns = [
    path('', views.index_home, name='index_home'),
    path('<int:pk>/', views.index_home_detail, name='index_home_detail'),
]

 

urls : sales/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('quotation/<int:pk>/', views.Quotation, name='quotation'),
]

 

 

platform 정리 : views

views : home

{SublimeText} home/views.py

from django.shortcuts import render, redirect
from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from django.contrib.auth.decorators import login_required
from home.models import Notice


def signup(request):
	if request.method == 'POST':
		if request.POST['password1'] == request.POST['password2']:
			user = User.objects.create_user(username=request.POST['username'], password=request.POST['password1'], email=request.POST['email'],)
			auth.login(request, user)
			return redirect('/signup_waiting')
		return render(request, 'signup.html')
	return render(request, 'signup.html')

@login_required
def index_home(request):
	Notices = Notice.objects.all()
	context = {'Notices': Notices}
	return render(request, 'index_home.html', context)

def index_home_detail(request, pk):
	Notices = Notice.objects.all()
	Notice_view  = Notice.objects.get(pk=pk)
	context = {'Notices': Notices, 'Notice_view': Notice_view}
	return render(request, 'index_home_detail.html', context)

 

views : sales

{SublimeText} sales/views.py

from django.shortcuts import render, redirect
from sales.models import SalesData
from django.contrib.auth.decorators import login_required


@login_required
def index_sales(request):
	SalesDatas = SalesData.objects.all()
	context = {'SalesDatas': SalesDatas}
	return render(request, 'index_sales.html', context)

def index_sales_detail(request, pk):
	SalesDatas = SalesData.objects.all()
	SalesData_view  = SalesData.objects.get(pk=pk)
	context = {'SalesDatas': SalesDatas, 'SalesData_view': SalesData_view}
	return render(request, 'index_sales_detail.html', context)

def Quotation(request, pk):
	Quotation = SalesData.objects.get(pk=pk)
	context = {'Quotation':Quotation}
	return render(request, 'quotation.html', context)

 

admin : home

{SublimeText} home/admin.py

from django.contrib import admin
from home.models import Notice


class NoticeAdmin(admin.ModelAdmin):
    search_fields = ['title']

admin.site.register(Notice, NoticeAdmin)

 

admin : sales

{SublimeText} sales/admin.py

from django.contrib import admin
from sales.models import SalesData


class SalesDataAdmin(admin.ModelAdmin):
    search_fields = ['item']

admin.site.register(SalesData, SalesDataAdmin)

 

 

platform 정리 : templates

templates : root

{SublimeText} templates/welcome.html

{% load static %}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Welcome_PERSONA_ERP</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="stylesheet" href="{% static 'css/style_home.css' %}">
  </head>

  <body>
    <div id="container">
      <div id="header">
        <!-- <h1>Responsive Layout</h1> -->
        <div class="logo">
          <a href="{% url 'welcome' %}"><img src="{% static 'img/logo_w_persona.png' %}" width="140" height="38"></a>
        </div>
        <div class="h-item">
          {% if user.is_authenticated %}
          <a href="{% url 'logout' %}"><input type="submit" value="{{ user.username }} (Logout)"></a>
          {% else %}
          <a href="{% url 'login' %}"><input type="submit" value="Login"></a>
          <a href="{% url 'signup' %}"><button type="submit">Sign-Up</button></a>
          {% endif %}
        </div>  
      </div>

      <div id="m-content">
        <h2>Thanks to visit PERSONA ERP</h2>
        <h3>기존회원로그인</h3>
          <p>로그인 후 모든 서비스를 사용할 수 있음.</p>
        <h3>회원가입안내</h3>
          <p>회원가입 승인 후 모든 서비스를 사용할 수 있음.</p>
      </div>
        
        {% block logform %}
        {% endblock %}

    <div id="footer">
      <p>Copyright © PERSONA All rights reversed.</p>
    </div>
    </div>
  </body>
</html>

 

templates : root

{SublimeText} templates/base.html

{% load static %}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>{% block title %}{{ section.title }}{% endblock %}</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="stylesheet" href="{% static 'css/style_home.css' %}">
  </head>

  <body>
    <div id="container">
      <div id="header">
        <div class="logo">
          <a href="{% url 'index_home' %}"><img src="{% static 'img/logo_w_persona.png' %}" width="140" height="38"></a>
        </div>
        <div class="h-item">
          {% if user.is_authenticated %}
          <a href="{% url 'logout' %}"><input type="submit" value="{{ user.username }} (Logout)"></a>
          {% else %}
          <a href="{% url 'login' %}"><input type="submit" value="Login"></a>
          {% endif %}
        </div>  
        <div class="search-item">
          <input type="search" name="q" placeholder="Search query">
          <input type="submit" value="Go!">
        </div>
      </div>

      {% include "navbar_main.html" %}
      <div id="m-content">
      {% block content1 %}
      {% endblock %}
      </div>

      {% include "navbar_sub.html" %}
      <div id="s-content">
      {% block content2 %}
      {% endblock %}
      </div>

    <div id="footer">
      <p>Copyright © PERSONA All rights reversed.</p>
    </div>
    </div>
  </body>
</html>

 

templates : root

{SublimeText} templates/login.html

{% extends 'welcome.html' %}
{% block logform %}
{% include "navbar_login.html" %}

<div id="s-content">
  <div>
    <form method="POST" class="post-form" action="{% url 'login' %}">
        {% csrf_token %}
        {% include "form_errors.html" %}
        <div>
            <label for="username">User-ID</label><br>
            <input type="text" name="username" id="username"
            	   value="{{ form.username.value|default_if_none:'' }}">
        </div>
        <div>
            <label for="password">Password</label><br>
            <input type="password" name="password" id="password"
                   value="{{ form.password.value|default_if_none:'' }}">
        </div>
        <button type="submit">Login</button>
    </form>
  </div>
</div>
{% endblock %}

 

templates : root

{SublimeText} templates/signup.html

{% extends 'welcome.html' %}
{% block logform %}
{% include "navbar_signup.html" %}

<div id="s-content">
  <div>
    <form method="POST" class="post-form">
        {% csrf_token %}
        {% include "form_errors.html" %}
        <div>
            <label for="username">User-ID</label><br>
            <input type="text" name="username" id="username"
            	   value="{{ form.username.value|default_if_none:'' }}">
        </div>
        <div>
            <label for="password1">Password</label><br>
            <input type="password" name="password1" id="password1"
                   value="{{ form.password1.value|default_if_none:'' }}">
        </div>
        <div>
            <label for="password2">Password Confirm</label><br>
            <input type="password" name="password2" id="password2"
                   value="{{ form.password2.value|default_if_none:'' }}">
        </div>
        <div>
            <label for="email">E-mail</label><br>
            <input type="text" name="email" id="email"
                   value="{{ form.email.value|default_if_none:'' }}">
        </div>
        <a href="{% url 'signup_waiting' %}"><button type="submit">Create</button></a>
    </form>
  </div>
</div>

{% endblock %}

 

templates : root

{SublimeText} templates/signup_waiting.html

{% extends 'welcome.html' %}
{% block logform %}

<div id="s-content">
  <h3>{{ user.username }}님 반갑습니다~^^</h3>
  <h3>{{ user.email }}로 관리자 승인 여부 확인 후 회신 예정입니다.</h3>
</div>

{% endblock %}

 

templates : root

{SublimeText} templates/form_errors.html

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div>
                <strong>{{ field.label }}</strong>
                {{ error }}
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div>
            <strong>{{ error }}</strong>
        </div>
    {% endfor %}
{% endif %}

 

templates : root

{SublimeText} templates/navbar_main.html

<nav class="nav_main">
  <ul>
    <li><a href="{% url 'index_home' %}">공지사항</a></li>
    <li><a href="{% url 'index_sales' %}">영업관리</a></li>
    <li><a href="#">생산관리</a></li>
    <li><a href="#">구매관리</a></li>
    <li><a href="#">품질관리</a></li>
    <li><a href="#">원가관리</a></li>
    <li><a href="#">인사관리</a></li>
    <li><a href="#">회계관리</a></li>
    <li><a href="#">무역관리</a></li>
    <li><a href="#">경영관리</a></li>
  </ul>
</nav>

 

templates : root

{SublimeText} templates/navbar_sub.html

<nav class="nav_sub">
  <ul>
    <li><a href="#">상세내용</a></li>
  </ul>
</nav>

 

templates : root

{SublimeText} templates/navbar_login.html

<nav class="nav_sub" style="color: white; font-size: 20px">
  <ul>
    <li>Login</li>
  </ul>
</nav>

 

templates : root

{SublimeText} templates/navbar_signup.html

<nav class="nav_sub" style="color: white; font-size: 20px">
  <ul>
    <li>Sign-Up</li>
  </ul>
</nav>

 

templates : home

{SublimeText} home/templates/index_home.html

{% extends 'base.html' %}
<!--navbar_main  -->
<!-- Main block -->
{% block content1 %}
<h2>공지사항</h2>
<table>
  <thead>
    <tr>
      <td><B>No.</B></td>
      <td><B>작성자</B></td>
      <td><B>제목</B></td>
      <td><B>작성일</B></td>
      <td><B>조회</B></td>
    </tr>
  </thead>
  <tbody>
    {% for Notice in Notices %}
    <tr>
      <td><a href="{% url 'index_home_detail' Notice.pk %}">{{Notice.num_cnt}}</a></td>
      <td>{{Notice.author}}</td>
      <td>{{Notice.title}}</td>
      <td>{{Notice.date_pub}}</td>
      <td>{{Notice.cnt_view}}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% endblock %}
<!-- End Main block -->

<!--navbar_sub  -->

<!-- Sub block -->
{% block content2 %}
{% endblock %}
<!-- End Sub block -->

 

templates : home

{SublimeText} home/templates/index_home_detail.html

{% extends 'base.html' %}
<!--navbar_main  -->
<!-- Main block -->
{% block content1 %}
<h2>공지사항</h2>
<table>
  <thead>
    <tr>
      <td><B>No.</B></td>
      <td><B>작성자</B></td>
      <td><B>제목</B></td>
      <td><B>작성일</B></td>
      <td><B>조회</B></td>
    </tr>
  </thead>
  <tbody>
    {% for Notice in Notices %}
    <tr>
      <td><a href="{% url 'index_home_detail' Notice.pk %}">{{Notice.num_cnt}}</a></td>
      <td>{{Notice.author}}</td>
      <td>{{Notice.title}}</td>
      <td>{{Notice.date_pub}}</td>
      <td>{{Notice.cnt_view}}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% endblock %}
<!-- End Main block -->

<!--navbar_sub  -->

<!-- Sub block -->
{% block content2 %}
  <h2>{{Notice_view.title}}</h2>
  <p>{{Notice_view.article}}</p>
{% endblock %}
<!-- End Sub block -->

 

templates : sales

{SublimeText} sales/templates/index_sales.html

{% extends 'base.html' %}
<!--navbar_main  -->
<!-- Main block -->
{% block content1 %}
<h2>영업관리 리스트</h2>
<table>
  <thead>
    <tr>
      <td><B>No.</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>
    </tr>
  </thead>

  <tbody>
    {% for SalesData in SalesDatas %}
    <tr>
      <td><a href="{% url 'index_sales_detail' SalesData.pk %}">{{SalesData.num_cnt}}</a></td>
      <td>{{SalesData.company}}</td>
      <td>{{SalesData.category}}</td>
      <td>{{SalesData.item}}</td>
      <td>{{SalesData.quantity}}</td>
      <td>{{SalesData.dateShip}}</td>
      <td><a href="{% url 'quotation' SalesData.pk %}" target='_blank'>Go!</a></td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% endblock %}
<!-- End Main block -->

<!--navbar_sub  -->

<!-- Sub block -->
{% block content2 %}
{% endblock %}
<!-- End Sub block -->


 

 

templates : sales

{SublimeText} sales/templates/index_sales_detail.html

{% extends 'base.html' %}
<!--navbar_main  -->
<!-- Main block -->
{% block content1 %}
<h2>영업관리 리스트</h2>
<table>
  <thead>
    <tr>
      <td><B>No.</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>
    </tr>
  </thead>

  <tbody>
    {% for SalesData in SalesDatas %}
    <tr>
      <td><a href="{% url 'index_sales_detail' SalesData.pk %}">{{SalesData.num_cnt}}</a></td>
      <td>{{SalesData.company}}</td>
      <td>{{SalesData.category}}</td>
      <td>{{SalesData.item}}</td>
      <td>{{SalesData.quantity}}</td>
      <td>{{SalesData.dateShip}}</td>
      <td><a href="{% url 'quotation' SalesData.pk %}" target='_blank'>Go!</a></td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% endblock %}
<!-- End Main block -->

<!--navbar_sub  -->

<!-- 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>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>{{SalesData_view.num_cnt}}</td>
      <td>{{SalesData_view.author}}</td>
      <td>{{SalesData_view.company}}</td>
      <td>{{SalesData_view.site}}</td>
      <td>{{SalesData_view.customer}}</td>
      <td>{{SalesData_view.category}}</td>
      <td>{{SalesData_view.item}}</td>
      <td>{{SalesData_view.quantity}}</td>
      <td>{{SalesData_view.dateShip}}</td>
      <td>{{SalesData_view.drawID}}</td>
      <td>{{SalesData_view.frameID}}</td>
      <td>{{SalesData_view.note}}</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 %}

 

templates : sales

{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">{{Quotation.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">{{Quotation.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">{{Quotation.item}}</td>
      <td class="tg-wp8o">{{Quotation.category}}</td>
      <td class="tg-wp8o">{{Quotation.layer}}</td>
      <td class="tg-wp8o">{{Quotation.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>

 

static : css

{SublimeText} static/css/style_home.css

table {
  width: 70%;
  border: 1px solid #444444;
  border-collapse: collapse;
  text-align:center;vertical-align:top
}

thead, tbody {
  border: 1px solid #444444;
  border-collapse: collapse;
}


input[type="text"] {
  margin: 5px;
  padding: 5px;
  border: solid 2px #bcbcbc;
  border-radius: 4px;
}

input[type="password"] {
  margin: 5px;
  padding: 5px;
  border: solid 2px #bcbcbc;
  border-radius: 4px;
  background-color: #000000;
}

#container {
  width: auto;
  padding: 5px;
  border: 1px solid #bcbcbc;
}

#header {
  height: 45px;
  padding: 1px;
  margin-bottom: 5px;
  border: 1px solid #bcbcbc;
  display: flex;
  align-items: center;
}

.logo {
  margin: 5px;
  padding: 5px;
}

.h-item {
  margin: 5px;
  padding: 10px;
}

.search-item {
  margin: 5px;
  padding: 5px;
  display: flex;
}

.nav_main {
  height:24px;
  background-color: #000000;
  display: flex;
  align-items: center;
}

.nav_sub {
  height:18px;
  background-color: #808080;
  display: flex;
  align-items: center;
}

nav ul {
  padding: 5px;
  display: flex;
}

nav li {
  display: inline;
  padding-left: 20px;
}

nav a {
  display: inline-block;
  font-size: 18px;
  text-transform: uppercase;
  text-decoration: none;
  color: white;
}


#m-content {
  width: auto;
  padding: 10px;
  margin-top: 5px;
  margin-bottom: 5px;
  border: 2px solid #000080;
}

#s-content {
  width: auto;
  padding: 10px;
  margin-top: 5px;
  margin-bottom: 5px;
  border: 2px solid #008080;
}

#footer {
  clear: both;
  padding-left: 10px;
  border: 1px solid #bcbcbc;
}


.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  overflow:hidden;padding:8px 10px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  font-weight:normal;overflow:hidden;padding:8px 10px;word-break:normal;}
.tg .tg-j4pq{background-color:#efefef;border-color:#000000;text-align:center;vertical-align:top}
.tg .tg-wp8o{border-color:#000000;text-align:center;vertical-align:top}
.tg .tg-jbyd{background-color:#ffffff;border-color:#000000;text-align:center;vertical-align:top}
.tg .tg-ymap{background-color:#ffffff;border-color:#000000;font-family:Arial, Helvetica, sans-serif !important;;font-size:28px;
  text-align:center;vertical-align:middle}
.tg .tg-73oq{border-color:#000000;text-align:left;vertical-align:top}
.tg .tg-fm1z{background-color:#f0f0f0;border-color:#000000;text-align:center;vertical-align:top}
.tg .tg-xwyw{border-color:#000000;text-align:center;vertical-align:middle}

 

[macOS](pyERP)testerp$ ./manage.py collectstatic

[macOS](pyERP)testerp$ tree

.

├── config

│   ├── __init__.py

│   ├── asgi.py

│   ├── settings.py

│   ├── urls.py

│   └── wsgi.py

├── db.sqlite3

├── home

│   ├── admin.py

│   ├── apps.py

│   ├── migrations

│   ├── models.py

│   ├── templates

│   │   ├── index_home.html

│   │   └── index_home_detail.html

│   ├── tests.py

│   ├── urls.py

│   └── views.py

├── manage.py

├── sales

│   ├── admin.py

│   ├── apps.py

│   ├── migrations

│   ├── models.py

│   ├── templates

│   │   ├── index_sales.html

│   │   ├── index_sales_detail.html

│   │   └── quotation.html

│   ├── tests.py

│   ├── urls.py

│   └── views.py

├── secret.json

├── static

│   ├── admin

│   ├── css

│   │   └── style_home.css

│   ├── img

│   │   ├── logo_b_persona.png

│   │   └── logo_w_persona.png

│   └── js

├── staticfiles

│   ├── admin

│   ├── css

│   │   └── style_home.css

│   ├── img

│   │   ├── logo_b_persona.png

│   │   └── logo_w_persona.png

│   └── js

└── templates

    ├── base.html

    ├── form_errors.html

    ├── login.html

    ├── navbar_login.html

    ├── navbar_main.html

    ├── navbar_signup.html

    ├── navbar_sub.html

    ├── signup.html

    ├── signup_waiting.html

    └── welcome.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
글 보관함