일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pyside6 ui
- qwindows.dll
- tensorflow
- channels
- django erp
- pip 오류
- 페이지 최적화
- pyside6
- 파이썬
- 장고
- Self ERP
- django
- optimization page
- uiload
- django rank
- django role based
- query 최적화
- ERP
- 중량 관리
- test drive development
- pip 설치
- orm 최적화
- qpa_plugin
- 재고 관리
- materialized
- 장고로 ERP
- Python
- django drf
- QApplication
- django test
- Today
- Total
취미삼아 배우는 프로그래밍
python ERP. 모델을 작성해보자.(부제: 삽질일기) 본문
아무래도 일은 이런걸 안 하지만,
취미삼아 개발쪽을 건드리다보니, 시간이 많이 안 난다.
먼저 메모해둘 사항)
django no such table ERROR:
python manage.py migrate --run-syncdb
git 으로 클론했을 때, 이거 안해주면 안되더라.
여튼,
이번엔 모델을 작성해 봤다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
from django.db import models
from todo.settings import DATE_INPUT_FORMATS
from datetime import datetime
# Create your models here.
class test_model(models.Model):
company_name = models.CharField(max_length=40,
null=True, verbose_name='업체명')
location_name = models.CharField(max_length=30,
null=True, verbose_name='현장명')
cat_1 = models.CharField(max_length=30,
null=True, blank=True, verbose_name='동')
cat_2 = models.CharField(max_length=30,
null=True, blank=True, verbose_name='층')
class Meta:
'''
[업체명, 현장명, 동, 층 구분]
에 대해서 고유한 값으로 하려고 작성한 부분.
'''
unique_together = ('company_name',
'location_name', 'cat_1', 'cat_2')
class wall_info(models.Model):
'''
월 도면접수 현황에 대한 모델.
코팅완료시, 비규격 완료확인으로 체크해야함.
'''
submit_date = models.DateField(name='접수일',auto_now_add=True)
manufacturing_id = models.CharField(max_length=10, null=True, blank=True)
wall_name = models.ForeignKey('test_model',on_delete=models.CASCADE, verbose_name='현장')
non_stnadard_area = models.FloatField(blank=True, null=True, verbose_name='비규격 면적')
standard_count = models.TextField(blank=True, null=True, verbose_name='규격 수량')
first_manufacturing = models.CharField(
max_length=20, verbose_name='제작업체', blank=True, null=True)
second_manufacturing = models.CharField(
max_length=20, verbose_name='코팅업체', blank=True, null=True)
addings_manufacturing = models.BooleanField(
default=True, verbose_name='덧방유무')
final_date = models.DateField(name='납기일', null=True, blank=True, verbose_name='납기일')
non_standard_coat_complete_chk = models.BooleanField(default=False, verbose_name='비규격 완료확인')
non_standard_manufacturing_chk = models.BooleanField(default=False, verbose_name='비규격 제작확인')
non_standard_outing_chk = models.BooleanField(default=False, verbose_name='제작 반출 확인')
standard_complete_chk = models.BooleanField(default=False, verbose_name='규격 완료확인')
notes = models.TextField(null=True, blank=True, verbose_name='제작특이사항')
salesman_name = models.CharField(max_length=10, null=True, blank=True, verbose_name='영업사원')
drawing_designer = models.CharField(max_length=10, null=True, blank=True, verbose_name='설계자')
|
cs |
프로세스 순서상으로 보면
- 제작도 접수
- 기타정보 입력
- 진행사항 수정
순으로 가야할 듯 하다.
제작도 접수는 가입력으로
[업체명, 현장명, 동, 층]을 먼저 적어둔 뒤, 기타 사항들을 입력하는 방식으로
기존 업무 프로세스와 유사하게 하려 한다.
그 뒤,
https://www.youtube.com/watch?v=6oOHlcHkX2U
Try DJANGO Tutorial - 23 - Django Model Forms
Try DJANGO Tutorial series is here to teach you Django bit by bit. Playlist: https://www.youtube.com/playlist?list=PLEsfXFp6DpzTD1BD1aWNxS2Ep06vIkaeW Code: https://github.com/codingforentrepreneurs/Try-Django Subscribe: http://joincfe.com/youtube Pro: htt
www.youtube.com
를 참고하여, HTML FORM을 만들어본다.
이것을 참고하여 만든 것은
1
2
3
4
5
6
7
8
9
10
11
12
|
##Modeltest_index.html 내용 추가.
...
<div>
<form method='POST' autocomplete="off" > {% csrf_token %}
{{ form.as_p }}
<button class="waves-effect waves-light btn"><i class="material-icons left">cloud</i>저장</button>
</form>
</div>
...
|
cs |
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
|
##views.py
from django.shortcuts import render, HttpResponseRedirect,HttpResponse
from .wall_forms import Drawings_input
#from django.contrib.messages import constants as messages
from django.contrib import messages
# Create your views here.
def drawings_submit_view(request):
form = Drawings_input(request.POST or None)
form_is_success = 'false'
if(request.method=='POST'):
if(form.is_valid()):
form.save()
form_is_success='true'
form = Drawings_input()
else:
pass
#response when success
#resp_body = '<script>alert("aaa");location.href="/test_2";</script>'
#return HttpResponse(resp_body)
context = {
'form':form,
'form_is_success':form_is_success,
}
return render(request, "modeltest/modeltest_index.html",context)
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
##wall_forms.py
from django import forms
from .models import test_model, wall_info
class Drawings_input(forms.ModelForm):
class Meta:
model = test_model
fields = [
'company_name',
'location_name',
'cat_1',
'cat_2'
]
|
cs |
--- 이다.
완성을 딱 하고
봤더니
materialize쪽에 forms 쪽을 참고하여, 아무리 조금씩 건드려도 바꿀 기미가 안보인다.
그래서, 새로 짜기로 마음먹었다.
어떻게 하느냐,
바로 소스를 보고 고치는것
이걸 Materialize -> Forms -> inline(페이지내 단어 검색)
쪽 내용처럼 교체해서 넣어준다.
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
|
<div class="row">
<div class="col s12">
<form method="POST" autocomplete="off"> {% csrf_token %}
<div class="input-field inline">
<input type="text" name="company_name" maxlength="40" required id="id_company_name">
<label for="id_company_name">업체명:</label>
</div>
<div class="input-field inline">
<label for="id_location_name">현장명:</label>
<input type="text" name="location_name" maxlength="30" required id="id_location_name">
</div>
<div class="input-field inline">
<label for="id_cat_1">동:</label>
<input type="text" name="cat_1" maxlength="30" id="id_cat_1">
</div>
<div class="input-field inline">
<label for="id_cat_2">층:</label>
<input type="text" name="cat_2" maxlength="30" id="id_cat_2">
</div>
<button class="waves-effect waves-light btn"><i class="material-icons left">cloud</i>저장</button>
</form>
</div>
</div>
|
cs |
이런 모양이 된다.
Form 하나가
이렇게 길다.
모델에서 적용시켜주었던, 옵션들이 모두 들어가있는걸 보면 새삼 신기하다.
그리고 admin을 통해 저장되는 데이터도 정상적으로 저장되는걸 확인할 수 있었다.
그치만,
이게
Unique 모델에 속성을 넣고
이리저리 굴려보니
등록이 됐는지 안 됐는지 모르겠는 문제점이 생긴다!
그래서 생각했다.
어떻게 방법(꼼수)이 없을까?
몇 가지 방법이 있는것 같다.
우선, 안되는 이유부터 생각해 보면
Data가 저장되는건 서버단이다.
서버는 사용자로부터 Data가 왔음을 저장을 하고
저장이 안 된다면 무언가를 콜백(되돌려줘야) 해야한다.
그리고 클라이언트(HTML)에선 그 무언가 값을 받아야 하는데,,
저장이 안 됐음을 알려주는 무언가를 통신해야 한다는 소리가 아닐까?
그치만!
Django는 Static한,, 그러니까 페이지를 한 번 불러놓고 서버와 그 무언가를 통신하는
기능을 기본적으로 제공하지 않는다.
내가 자세하고 정확하겐 모르지만,
일반적으로 form은 Redirect를 하는것 같다.
Form을 제출함으로써 일단 페이지를 새로 로딩시킨다는 말인데,,
서버단과 통신도 안하고
redirect도 해서 자바스크립트도 새로 불러오고
언뜻 보면,
이런게 되게 쉬워보였는데,
막상 간단한 폼 하나 조차 통과시키려 하니 복잡한 것들이 물려있다.
음
이거,,
일단 생각나는 방법은
4 가지 이다.
* 폼 제출이 성공적인지 아닌지 여부를 확인하는 방법
- AJAX 를 통해 Form을 제출
- Django View에서 변수를 통해 제출이 됐는지, 안 됐는지를 판단하여 문자열로 'false' 또는 'true'를 반환시킨다.(파이썬에서 bool은 첫 글자 대문자로 True 및 False로 제출된다. 반면, 자바스크립트는 true 또는 false 소문자이다.. 그래서 차라리 둘 모두 문자열로 넘겨줘서 체크를 해주는게 속편한듯 하다.) 이 값을 통해 리다이렉트시 체크토록 하는것이다..
- iFrame을 숨겨두어 iFrame 쪽에서 반환값을 받아오게 한 후, Redirect는 내부 iFrame으로 지정한다. 그리고, 그 내부 값을 체크하는 자바스크립트를 통해 성공적인지, 아닌지 여부를 확인하여 메세지토록 한다.
- 모델의 Unique를 안 쓴다.(ㅎㅎ. 왠지 행복.)
1번은 다른 방법이 없으면 하겠는데, 지금은 못하겠다.
코드도 난잡해 지고, 앞으로 등록할 폼이 몇 개고 컬럼이 몇 개인데,,
이걸 다하겠나 싶다.
2번 참고 소스
1
2
3
4
5
6
7
8
9
10
11
|
window.onload = function() {
var is_form_updated = {{ form_is_success }};
//alert(is_form_updated);
if(is_form_updated=='true'){
saved();
}
if(is_form_updated=='not'){
unsaved();
}
};
|
cs |
이런식으로 form_is_success 쪽에 View단으로부터 정보를 받아와
true면 메세지를 띄우고
not이면 저장이 안 됐다고 하고
false(View단으로 부터 넘어오는 기본값)면 그냥 가만히 있는 형태이다.
3번 참고 사이트(스택오버플로우)
https://stackoverflow.com/questions/25983603/how-to-submit-html-form-without-redirection/30666118
이중에서 2번은 해보고, 3번은 안 해봤다.
3번은 하게 된다면, template을 하나 더 생성해서
완료인지 완료가 아닌지를 표기하는 내용을 추가하면
될 것 같기도 하다.
근데 이거 꼼수를 너무 부리고 있는데,,
나중에 엄청 꼬이는거 아닌가 모르겠다.
일단 지금 진행상황은 여기까지다.
끝으로,
진도좀 나가나 싶었는데
데이터 저장 됐는지 확인하는 부분부터 막혀버려서
앞으로 이거 되겠나 싶다.
ㅠㅠ
왜케 어렵누
'파이썬(장고)' 카테고리의 다른 글
self erp system 만들기 로그.191102 (0) | 2019.11.03 |
---|---|
django-channels-database-tableout (0) | 2019.10.31 |
Python Django . ERP . 모델을 작성해보자. (0) | 2019.10.15 |
Django 로 ERP를 만들어 보려한다. (0) | 2019.10.14 |
Django 삽질기. 그 시작. (0) | 2019.10.14 |