폼을 직접 만들어서 데이터를 처리한 적이 있다. 

폼의 작동 원리를 알았다면 활용도 높은 모델 폼(ModelForm)을 통해 데이터를 처리하는 방법을 알아본다.

* 모델 폼 작성요령(https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/)은 이곳에서 살펴보면 된다.


웹사이트에서 모델 폼을 통해 입력 받은 데이터를 view에서 어떻게 처리하는지는 
여기(https://docs.djangoproject.com/en/1.10/topics/forms/)에 설명이 되어있다.


나의 목표는 

1) 웹사이트에 모델 폼을 만들어서 데이터를 입력 받을 수 있도록 만들고
2) 모델 폼을 통해 입력 받은 데이터데이터베이스에 저장하도록 한다 (단, 조건에 부합한 경우저장, 아니면 재작성)


1-1) forms.py에서 Character 모델 클래스를 반영한 모델 폼 클래스를 만든다.

1
2
3
4
5
6
7
8
9
class CharacterForm(ModelForm):
     class Meta:
         model = Character
         fields = (
             'user',
             'name',
             'type',
             'gender'
         )
cs


1-2) View에서 만들어진 모델 폼호출하여 템플릿에 전달한다. 
   
1
2
3
4
5
def index(request):
    ctx = {}
    if request.method == "GET":
        form = CharacterForm()
        ctx.update({ "form" : form })
cs


GET 방식일 때, 빈 폼변수에 담아 템플릿으로 보낸다. 
폼이 비어있는 상태에서 데이터를 입력 받을 수 있도록 하기 위함이다. 
(템플릿에서 직접 폼을 만드는 번거로움이 확연히 줄었다)



2) 폼을 통해 입력 받은 데이터를 View에서 처리하여 데이터베이스에 저장한다.

 

(웹사이트에서 폼을 통해 데이터가 전송된 상황) POST 요청일때, request로부터 데이터를 가져와 폼 인스턴스를 만든다.

- *폼은 데이터가 입력된 폼 인스턴스에 대한 유효성 검사(데이터베이스 필드조건 부합)를 할 수 있다.

- Partner 클래스에 user 필드를 제외한 name, contact, address, description 필드에만 데이터를 입력 받은 상태이다.

- 인스턴스는 비어있는 필드가 있으면 데이터베이스에 저장하지 않는 경우가 발생한다.

- 아니면 저장하기 전직접 필드에 데이터를 입력하여 최종 저장시킨다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
def index(request):
    ctx = {}
    if request.method == "GET":
        form = CharacterForm()
        ctx.update({ "form" : form })
    elif request.method == "POST":
        form = CharacterForm(request.POST)
        if form.is_valid():
            character = form.save(commit=False)
            character.user = request.user
            character.save()
            return redirect("/character/")
        else:
            ctx.update({ "form" : form })
cs


2-1) 데이터를 저장하므로 POST 방식을 사용하고, 데이터를 입력 받은 폼변수로 지정한다.

 

2-2) form.is_valid()를 통해 입력된 데이터의 유효성 검사를 한다. 올바르지 않으면 재작성한다.


2-3) user 값은 직접 입력하는 것이 아니므로 별도로 채워서 최종 저장을 한다.

블로그 이미지

쵸잇

,

서비스를 이용하다가 1개 계정당 게임 캐릭터를 1개 사용할 수 있다던지하는 예를 본 적이 있을 것이다.

계정 데이터를 갖고 있는 User 테이블게임 캐릭터 정보를 갖고 있는 Charater 테이블을 만들면 아래와 같다.


User

id

username

email

password

1

streetfighter

realguy@world.com 

************** 

2

kingoffighter

toughguy@world.com 

*********** 


Character 

id

user(OneToOne)

name 

type

gender

1

1

길거리파이터

태권도

여자

2

2

싸움왕

무에타이

남자


로그인시 사용하는 계정 이름"streetfighter"인 사용자는 게임에서 "길거리파이터"라는 캐릭터 이름을 갖고 있다. 

"streetfighter"로 접속한 사람이 게임에서 사용할 캐릭터는 "길거리파이터" 뿐인 것이다.


이렇게 1대1인스턴스를 이어주는 역할을 하는 것이 OneToOneField이다.


서로 데이터가 연결되어있으니 User 테이블에서 Charater 테이블로 자유롭게 접근이 가능해진다.

OneToOneField를 사용하기 위해서는 관계를 맺을 테이블에서 새로 필드를 만들어서 자신의 테이블명을 입력하면 완성된다.


1
2
3
4
5
class Character(models.Model):
    user = models.OneToOneField(User)
    name
    type
    gender
cs


블로그 이미지

쵸잇

,

(E6)셀의 열 번호가 홀수인지 궁금하다면?


1) 셀의 열 번호를 나타내는 함수인 column()에서 임의의 셀(E6)을 입력하면 열의 위치를 나타내는 알파벳(E)을 숫자로 반환한다.

예) "=column(E6)"은 E열이 5번째 위치하므로 5를 출력한다.


2) 홀수 여부를 묻는 것은 isodd()에서 값을 입력 받으면 True 또는 False 값을 반환한다.

예) "=isodd(3)"은 True라는 값이 출력된다.


[E3:S31] 범위에서 열 번호홀수인 경우만 서식을 변경하려면, 

열 번호를 구하는 함수 column()과 홀수 여부를 구하는 함수 isodd()를 사용한다.

조건부서식에서 규칙으로 "=isodd(column())"를 입력하면 열 번호가 홀수에 해당하는 부분만 걸러진다.




날짜 (12/1)의 월의 수가 홀수 여부를 가리려면?


1) 날짜의 월의 수는 month() 함수를 사용한다. "12/1" 입력된 셀 위치가 F4라면 month(F4)를 입력시 "12"만 돌려받는다.


2) 홀수 여부는 isodd()이다. 


구하고자하는 날짜 (5/23)의 월수홀수인지 알고싶다면,

월수를 구하는 month()와 홀수를 구하는 isodd()를 조합하면 된다.

즉 "=isodd(month(날짜가 적힌 셀 참조))"를 입력하면 원하는 조건대로 서식이 가능하다.




"J00001"이라는 셀 값에서 J값만 뽑아내려면?


J값의 위치가 왼쪽에 있으므로 LEFT() 함수를 사용한다.

"J00001"이 A1 셀에 위치한다면, LEFT(A1,1)이라고 입력하면 "J" 값을 돌려받는다.


그럼 A1셀부터 A열이 고정된 상태로 범위가 지정된 셀까지 첫번째 값이 J인 경우만 찾을려면,

A열이 고정되므로 $A1으로 입력하고, 첫번째 값을 구하니 LEFT($A,1)라고 먼저 입력한다.

그 다음 J인 경우만 해당하도록 LEFT($A1,1)="J" 라고 입력한다. 문자이므로 반드시 " " 를 사용한다




3의 배수를 구하려면?


3의 배수는 3, 6, 9, 12, … 이다

3의 배수의 특징은 3으로 나누면 나머지가 0이 된다.

그럼 나머지를 구하는 함수인 MOD()를 사용하여 3으로 나눴을 때 나머지가 0인 값만 추려낼 수 있다.


W3셀부터 W열이 고정된 상태에서 지정된 범위까지의 숫자 중에 3의 배수에 서식을 주려면?

참조할 셀을 $W3으로 입력하고, 3의 배수를 구하도록 나눌 값 3을 넣은 함수 MOD($W3,3)를 완성한다.

3으로 나누더라도 나머지가 0인 값만 찾아야하니 MOD($W3, 3)=0을오 마무리하면 된다.


'오피스 > 엑셀' 카테고리의 다른 글

엑셀 단축키 학습  (0) 2018.12.03
고급필터 학습  (0) 2018.12.03
데이터 표시형식 바꾸기  (0) 2018.11.27
블로그 이미지

쵸잇

,