(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
블로그 이미지

쵸잇

,

회원으로 인증 받기(로그인) 위해서 필요한 절차는?


보통 로그인은 내가 입력한 username, password 값을 회원가입 때 저장된 username, password 값과 대조하는 시스템이다. 



로그인 폼을 만들어 username과 password를 입력하고,


view에서 전달 받은 username과 password를 갖고 데이터베이스에 저장된 데이터와 대조하여 인증 절차를 거친다.

(인증 기능을 갖고 있는 authenticate 함수를 활용한다)


그 결과 회원 인증 완료시 원하는 페이지를 출력한다.



1) 로그인 폼을 만들어 username과 password 입력칸을 만든다


1
2
3
4
5
6
7
8
9
10
11
{% block body %}
<div class="container">
  <form method="post" action="" class="form-signin">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please log in</h2>
    <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="password" name="password" class="form-control" placeholder="Password" required="">
    <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button>
  </form>
</div>
{% endblock %}
cs



view에서 인증처리하는 방식에 대한 설명은 아래와 같다.

(https://docs.djangoproject.com/en/1.10/topics/auth/default/#how-to-log-a-user-in)



1
2
3
4
5
6
7
8
9
10
11
from django.contrib.auth import authenticate, login
 
def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
    else:
        # Return an 'invalid login' error message.
cs



로그인 폼에서 입력 받은 username과 password 값을 authenticate 함수를 통해 인증 절차를 거치고,

if문을 작성하여 확인 여부에 따라 로그인 처리를 하는 login 함수를 사용한다.

로그인에 성공하면 원하는 페이지로 redirect 시킬 수 있게 url을 입력한다.



2) authenticate 함수와 login 함수를 적용한다


1
2
3
4
5
6
7
8
9
10
11
12
13
def login(request):
    if request.method == "GET":
        pass
    elif request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username, password=password)
        if user is not None:
            auth_login(request, user)
        else:
            pass
 
        return redirect("/partner/")
cs



login에서 auth_login으로 바뀐 까닭은?

이미 view의 이름으로 login이 존재하므로 중복사용을 피하고자 다른 명칭으로 login 함수를 사용해야한다.

안그러면 오류가 발생하는데 이유는 최초에 쓰인 login 함수가 2개의 인자를 받지 않고 request 한 개만 받고 있기 때문이다.


이를 위해 함수를 import할 때 전치사 "as"를 사용하여 auth_login으로 사용함을 명시해주어야한다.


1
from django.contrib.auth import authenticate, login as auth_login
cs


그럼 중복을 피하면서 똑같은 기능을 유지할 수 있다. 


이번에는 로그인에 실패한 경우 실패메시지를 보내도록 설정해보자.


로그인 폼에서 입력 받은 정보가 똑같이 데이터베이스로 전달되지만,


User 모델에 저장된 회원 정보와 다를 경우 login 처리를 시키지 않고,


로그인 폼 아래에 "존재하지 않는 사용자"라는 텍스트만 전달할 뿐 어떠한 변화를 주지 않는다.

   


1
2
        else:
            ctx.update({ "error" : "존재하지 않는 사용자입니다." })
cs


비어있는 ctx 변수의 값을 변경하는 방식으로 메시지 전달 방식을 택했다.


1
2
3
4
5
6
7
8
9
10
<div class="container">
  <form method="post" action="" class="form-signin">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please log in</h2>
    <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="password" name="password" class="form-control" placeholder="Password" required="">
    {{ error }}
    <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button>
  </form>
</div>
cs



로그아웃 하기


로그아웃은 로그인시 사용된 우리의 정보가 떨어져 나가게 하는 시스템이다.

따라서 로그인과 다른 점은, 데이터 입력이 필요 없다. logout 함수만 사용하면 로그아웃 완료된다.



1
2
3
def logout(request):
    auth_logout(request)
    return redirect("/partner/")
cs


단, 로그아웃 버튼에 대한 url 주소를 추가할 필요가 있다. 그래야 logout 함수가 활성화된다.


1
2
3
4
5
6
7
8
9
from django.conf.urls import url
from .views import index, signup, login, logout
 
urlpatterns = [
    url(r'^$', index, name='index'),
    url(r'^signup/$', signup, name='signup'),
    url(r'^login/$', login, name='login'),
    url(r'^logout/$', logout, name='logout'),
]
cs


블로그 이미지

쵸잇

,

장고의 장점 중에 하나인 내장된 User 모델을 활용하여 유저 관리를 쉽게 할 수 있다.


장고 authentication system에서 User 모델에 대한 설명이 있다.

https://docs.djangoproject.com/en/1.10/topics/auth/default/


위 자료를 통해 User 모델의 속성을 파악할 수 있고,

실제로 어떤 코드로 User 모델이 짜여져 있는지 확인하려면 아래 깃허브를 따라서 살펴볼 수 있다.
https://github.com/django/django/blob/master/django/contrib/auth/models.py



User 모델의 사용 목적은 회원가입을 받아서 회원들의 데이터를 저장하고자하는 것이다.

회원가입 폼을 만들어 "username" "email" "password"를 입력 받는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
{% extends "base.html" %}
{% block title %}my_project{% endblock %}
{% block body %}
<div class="container">
  <form method="post" action="" class="form-signin">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please sign in</h2>
    <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="email" name="email" class="form-control" placeholder="Email address" required="">
    <input type="password" name="password" class="form-control" placeholder="Password" required="">
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
  </form>
</div>
{% endblock %}
cs


1
<input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
cs


(*autofocus는 해당 웹페이지를 처음 열었을 때, 입력 폼에서 "username"을 입력하는 칸에 커서가 깜빡이도록 설정)


앞서 말했듯 장고에서 별도로 User 모델을 갖추고 있으므로 models.py에서 우리가 관여할 것은 전혀 없다.

User 모델이 저장된 곳에서 view로 잘 불러오기만 하면 된다. (from django.contrib.auth.models import User)

그리고 폼에서 입력 받은 데이터를 view에서 처리하여 하나의 user 객체로 만들어 User 모델에 저장된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.shortcuts import render
from django.contrib.auth.models import User
 
# Create your views here.
def index(request):
    ctx = {}
    return render(request, "index.html", ctx)
 
def signup(request):
    if request.method == "GET":
        pass
    elif request.method == "POST":
        username = request.POST.get("username")
        email = request.POST.get("email")
        password = request.POST.get("password")
 
        user = User.objects.create_user(username, email, password)
 
    ctx = {}
    return render(request, "signup.html", ctx)
cs



user 인스터스가 만들어질 때 기존의 방식과 다른 점이 있다.


하나는 user 변수에 데이터를 입력 받은 객체를 담는다는 것이다.


두번째는 User.objects.create가 아닌 User.objects.create_user로 작성하는 것이다.


이 차이에 발생하는 장점은 폼에서 password를 입력한 그대로 저장되어 관리자에게 보여지지 않고,

특수 암호화되어 관리자도 볼 수 없게 처리하기 때문에 보안측면에서 도움이 된다.

블로그 이미지

쵸잇

,

실수로 표시된 재고율 데이터의 가독성을 높이고자 백분율로 표시 형식을 바꿀 것이다.

만약 음수나 숫자 0이 있다면 "*" 표시할 것이다.



영업소별 라도스 재고현황
단가 :         24,500
영업소코드 영업소명 입고량 판매량 재고량 판매금액 재고율
SE-001 서울 500 450 50 11025000 0.1
BU-002 부산 350 320 30 7840000 0.08571429
DA-003 대구 300 280 20 6860000 0.06666667
GW-004 광주 300 300 0 7350000 0
TA-005 대전 250 230 20 5635000 0.08
SE-001 서울 250 220 30 5390000 0.12
BU-002 부산 250 200 50 4900000 0.2
DA-003 대구 200 175 25 4287500 0.125
GW-004 광주 200 170 30 4165000 0.15
TA-005 대전 150 135 15 3307500 0.1
SE-001 서울 150 140 10 3430000 0.06666667



재고율

0.1


0.08571429
0.06666667
0
0.08
0.12
0.2
0.125
0.15

0.1

0.06666667




셀서식 - 표시형식 - 사용자 지정 탭으로 들어가서


빈칸에 우리가 원하는 바를 입력한다.


1) 백분율을 나타내려면 0.0% 입력

2) 음수를 "*"하려면 "*" 입력

3) 숫자 0을 "*"하려면 "*" 입력


3가지를 묶어서 표현하려면 ";"를 입력해서 이어주면 된다.


0.0%;"*";"*"


주의할 점은 입력하는데 순서가 존재하므로 이 규칙을 따라 형식을 작성한다.

양수, 음수, 숫자 0, 텍스트 순으로 활성화가 된다.


따라서 실수로 된 양수는 백분율로 표시, 음수와 숫자 0은 "*"로 표시한다는 말이다. 



서식이 반영된 재고율


재고율

10.0%


8.6%


6.7%

*

8.0%

12.0%

20.0%

12.5%

15.0%

10.0%

6.7%


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

엑셀 단축키 학습  (0) 2018.12.03
고급필터 학습  (0) 2018.12.03
조건부서식용 함수 학습  (0) 2018.11.29
블로그 이미지

쵸잇

,

최근에 만든 댓글 입력 폼은 작성하자마자 리다이렉션이 되어 화면에 댓글이 나타났다.

이를 즉시 노출하는 것에서 Admin을 통해 승인된 댓글만 보여지는 형태로 바꿔볼 것이다.


어떻게 댓글이 안보이다가 보이는지 생각해보면,

댓글의 허용 여부에 따라 화면에 노출되냐 마냐가 결정된다.


그러므로 Comment에 새로운 속성이 추가되어야 한다.

https://docs.djangoproject.com/en/2.1/ref/models/fields/


우리의 목적에 필요한 필드 속성은 참과 거짓의 값을 담는 BooleanField이다.

BooleanField 사용시 기본값을 정해주는데 최초 노출은 하지않으므로 False를 입력한다.

필드명은 목적에 부합하는 approved_comment로 정했다.



1
2
3
4
5
6
7
8
9
class Comment(models.Model):
    article = models.ForeignKey(
        Article,
        related_name="article_comments",
        on_delete=models.CASCADE
    )
    username = models.CharField(max_length=50)
    content = models.CharField(max_length=200)
    approved_comment = models.BooleanField(default=False)
cs



폼을 통해 comment에 대한 데이터를 받을 때에도 False 값을 받도록 고정시켰다.



1
2
3
4
5
6
7
8
9
    elif request.method == "POST":
        username = request.POST.get("username")
        content = request.POST.get("content")
        Comment.objects.create(
            article=article_detail,
            username=username,
            content=content,
            approved_comment=False
        )
cs



이제 템플릿에서 댓글 데이터를 가져올 때 True or False 여부를 따져서 노출시킬 필요가 있다.



1
2
3
4
5
6
7
8
       {% for comment in article_detail.article_comments.all %}
       {% if comment.approved_comment is True %}
       <h4 class="author">{{ comment.username }}</h4>
       <div class="text">
       {{ comment.content }}
       </div>
       {% endif %}
       {% endfor %}
cs


approve_comment의 값이 True인 경우에만 데이터가 노출되도록 if문을 작성했다.

기본적으로 댓글에 False 값을 가지므로 Admin을 통해 허용 여부가 체크되어야 비로소 화면에 노출된다.

블로그 이미지

쵸잇

,

"〜ている"는 기초 중의 기초 문법으로 처음에 많이 배운다.

그런데, 현재진행형으로 해석되는 "~하는 중이다"로만 알려주고 가르친다.


이걸 배우고 일드나 일본여행을 하면 "〜ている"의 쓰임이 내가 알고있는 경우와 달라 당황스러울 때가 있다.


〜ている

〜ていました



자주 쓰이는 예시를 갖고 왔다.


우리말로 "결혼했어요"를 어떻게 이해하는가? 


"결혼하셨구나"라고 바로 이해한다.


일본어로 "結婚しました"라고 하면, 과거에 결혼했었다고만 알지 현재 결혼이 유지되고 있는지 알 수 없다는 것이다.

영어의 과거형과 상당히 유사하다.


결혼한 상태임을 말할 때는 "結婚しています"라고 표현한다.

"결혼하는 중입니다"가 아니라 "결혼한 상태입니다"라고 받아들여야한다.


영어에서는 현재완료를 사용해서 "I have got married"라고 결혼생활을 하고있음을 나타낸다.

중국어는 과거형 "他结婚了"으로 결혼했음을 우리말처럼 표현가능하다.


"彼は家に来ている。" 해석은 "그는 집에 오는 중이다"

이것도 틀린 해석이다.

올바른 번역은 "그는 집에 온 상태다"


현재진행형으로 사용할 경우 "彼は家に来ている最中だ。"라고 써야한다. 추가적인 상황 설명이 필요하다.


하나 더 살펴보자.

"うちの娘が卒業するごろ、僕は野球選手を辞めているだろう。"

"우리 딸이 졸업할 무렵에, 나는 야구선수를 그만두고 있겠지."

지금까지 학습한대로 다시 보면,

"우리 딸이 졸업할 무렵에, 나는 야구선수를 그만 둔 상태겠지."



과거진행형을 살펴보자.


"学生時代に、僕は日記を書いていました。"

우리말로는 "학생때 나는 일기를 쓰고 있었습니다"라고 해석되는데, 일본어로는 "학생때 나는 일기를 썼습니다"라고 이해한다.

과거의 일정기간 동안 습관처럼 행위를 했을 때 사용하는 것 같다.


"私はいつも毎朝七時には学校に着いていました。"

"저는 항상 매일 아침 7시에 학교에 도착하고 있었습니다"

이것도 학습한대로,

"저는 항상 매일 아침 7시에 학교에 도착했습니다"(습관처럼 빠짐없이 행위가 이어짐)



정리하면, 

"〜ている"는 우리식으로 현재진행형으로 번역이 되지 않으면 "~한 상태다"라고 이해하고,

"〜ていました"은 "~했다"라고 보는 게 좋다.





'외국어 > 일본어' 카테고리의 다른 글

〜に決まっている 파헤치기  (0) 2018.11.30
수동형  (0) 2018.11.23
블로그 이미지

쵸잇

,

수동형

외국어/일본어 2018. 11. 23. 19:54

일본어 수동형은 처음 배울 때 신기하면서도 난해하다. 그래서 배우고도 어색해서 회화로 쓰기가 어려웠다.

우리말과 비슷한 수동형의 문장이라면 일본어로도 어색하지 않지만, 그외 어색하게 들리는 수동형 문장이 많았다.



"엄마가 나를 깨웠다"

母が僕を起こした。


일본어에서는 특이하게 수동형으로 더 많이 쓰인단다. 이렇게.

"나는 엄마에게 깨워짐을 당했다"

"僕は母に起こされた。"


http://feed.conects.com/1796


일본어 고수가 남긴 글에서 봐도 문법적으로 이해하는데는 도움이 크게 되는건 아니지만,

이 분의 의견은 일본인의 의식과 사고방식에 빗댄 언어라는게 보여진다. 간접적으로 표현하기 위해 쓴다.

수동형을 이해하더라도 결국 자주 익혀서 익숙해지는 방법 뿐인것 같다.


어떠한 상황에서 쓰면 좋을지 찾아본 결과, 


1) 의도치 않게 어떤 행위를 당하는 경우(피해의 뉘앙스가 크다)


僕は母に起こされた。나는 엄마에게 (의도치 않게) 깨워졌다.

先生に怒られた。 선생님에게 (의도치 않게) 혼났다.

妹に日記を読まれた。여동생에게 일기를 (의도치 않게) 읽혔다. 

家は観光客にゴミを捨てられた。우리집은 관광객에게 (의도치 않게) 쓰레기가 버려졌다.

友達に新しい家来られた。친구에게 (의도치 않게) 새 집을 방문 당했다. (안왔으면 했는데 온 꼴) 


2) する의 수동형인 される는 앞의 명사에 따라 "~되다" 혹은 "~받다"라는 해석이 주류다.


オリンピックが開催された。올림픽이 개최되었다.

教授に質問された。교수님에게 질문 받았다.

お祖母さんに指摘された。할머니에게 지적 받았다.



추가로 고민해보니 우리말은 행위를 일으키는 주어에 집중되고, 일본어는 당하는 행위가 포함된 동사에 집중되는 것 같다.

해석상 의도치 않게 행위를 당했다고 보기 힘든 경우도 있으니 주의하면서 이해해야겠다

블로그 이미지

쵸잇

,

중국어로 "~때문에" 표현을 쓰고 싶었는데 드디어 책에 나왔다. (아직 한참 초보가 분명하다.)


因为~, 所以~ (Yīn wéi~, suǒyǐ~)

~때문에, 그래서 ~하다


因为买了很多书,所以钱都花光了。

(때문에 샀다 많은 책, 그래서 돈 모두 썼다 다 ▶ 책을 많이 샀기 때문에 모든 돈을 다 써버렸다)


因为太累了,所以就在家里休息。

(때문에 너무 피곤했다, 그래서 바로 집에서 쉬었다 ▶ 너무 피곤했기 때문에 곧장 집에서 쉬었다)


因为我妈来了,所以不能去你家玩儿。

(때문에 우리 엄마 왔다, 그래서 갈 수 없다 너네 집 놀러 ▶ 엄마가 왔기 때문에 너네집에 놀러갈 수 없다)


因为今天下雨,所以不能去跑步。

(때문에 오늘 비온다, 그래서 갈 수 없다 달리러 ▶ 오늘 비가 오기 때문에 달리기하러 갈 수 없다)


因为我喜欢中国菜,所以学汉语。

(때문에 나는 중국음식을, 그래서 배운다 중국어를 ▶ 나는 중국음식을 좋아해서 중국어를 배운다)


因为天气很冷,所以要多穿衣服。

(때문에 날씨가 춥다, 그래서 입어야한다 많은 옷을 ▶ 날씨가 춥기 때문에 옷을 많이 입어야한다)


因为最近很忙,所以没有时间休息。

(때문에 최근 바쁘다, 그래서 없다 시간 쉴 ▶ 최근에 바빠서 쉴 시간이 없다)

'외국어 > 중국어' 카테고리의 다른 글

조동사 会 파헤치기  (0) 2018.11.30
결과보어  (0) 2018.11.22
조동사 可以  (0) 2018.11.20
정도보어(상태보어)와 得  (0) 2018.11.19
기초문법 (4) - 방위사  (0) 2018.10.20
블로그 이미지

쵸잇

,

GET과 POST

코딩 연습/Django 2018. 11. 23. 13:51

GET 방식

- 지정한 URL의 정보를 가져온다.

- 웹 브라우저를 이용하여 서버로부터 웹 페이지, 이미지, 동영상 등을 가져오려 할 때 사용하는 방식이다.

- 서버 시스템의 상태를 바꾸지 않는 요청시 사용한다.

단점

- URL의 길이 제한이 있으므로 보낼 수 있는 데이터의 양이 적다

- 전달되는 데이터가 웹 브라우저의 주소창에 노출되어 보안 측면에서 불리하다

장점

- URL에 데이터가 포함되므로 검색 폼에서 유용하다. URL을 북마크해두고 공유하기 좋다.


POST 방식

- 대표적 기능으로 리소스를 생성하는 것이다. 예시로 블로그에 글이나 댓글을 등록하는 경우다.

- 서버 시스템의 상태를 바꾸는 요청시에 사용한다.

블로그 이미지

쵸잇

,

폼을 만드는 과정을 생각해보자


1. 웹사이트에서 사용자를 통해 어떤 데이터를 입력 받을지 고민


나의 목표는 블로그 방문자의 댓글을 입력 받고 이를 데이터베이스에 보관하는 것이다.

댓글의 기록은 모델에서 Comment 클래스 형태로 username 필드content 필드를 가지고 있다.

데이터베이스는 만들어졌으니 입력 받을 수 있는 폼(form)을 만들어야한다. *폼은 일종의 양식이라 보면 된다.

폼을 통해 입력 받을 데이터는 username과 content이다. 댓글을 남기는 사람댓글 내용을 말한다.



2. 템플릿에서 앞서 고민한 내용을 담은 폼을 만든다.


1
2
3
4
5
6
<form method="post" action="">
    {% csrf_token %}
    <input name="username" />
    <input name="content" />
    <button type="submit">댓글달기</button>    
</form>
cs


*폼에서는 CSRF 공격을 방지하기 위해 {% csrf_token %} 작성한다. 폼을 통해 악의적인 스크립트 문장이 들어올 수 있다.


폼 태그를 사용하려면 method 지정과 action 지정이 필요하다.

method는 get과 post 중에 하나인데, 폼은 데이터를 불러오는게 아니라 저장하는 역할을 하므로 post를 사용해야한다.

action은 입력할 데이터를 받을 웹페이지를 지정하는데 현재페이지인 경우 공백을 둔다.

input은 사용자가 데이터를 입력하는 공간을 만들어준다. 

name은 어떤 데이터인지 명시하고, view에서 데이터를 전달하는 매개변수로도 쓰인다.

button은 말그대로 입력을 완료하고 제출할 수 있도록 버튼을 만들어준다.

submit은 버튼을 제출 형태로 사용하도록 하기 위함이다.



1
2
3
4
5
6
7
8
9
10
if request.method == "POST":
    username = request.POST.get("username")
    content = request.POST.get("content")
    Comment.objects.create(
        article=article_id,
        username=username,
       content=content,
    )
 
    return HttpResponseRedirect("/{}/".format(article_id))
cs



GET 방식은 비어있는 폼 양식을 불러오는 역할을 하는데, 아직은 쓰이지 않으므로 생략했다.

view에서는 템플릿을 통해 입력받은 데이터를 데이터베이스에 저장하는 역할을 하므로 POST 방식 사용한다.


request.POST는 웹사이트에서 사용자가 입력하고 제출된 데이터를 갖고 있다.

request.POST.get는 조건에 맞는 값을 하나 가져오는 쿼리로서 username과 content 값을 호출한다. 

이를 각각 username과 content 변수에 담는다.


Comment.objects.create는 Comment 클래스에 새로운 인스턴스를 추가하는 것이다.

Comment 클래스에는 3개의 필드(article, username, content)가 포함되어 있으므로 순서대로 값을 지정한다.

article의 경우에는 url을 통해서 받은 게시글의 id 값이 입력된다. 


HttpResponseRedirect 메소드화면을 자동으로 새로고침 해주어 데이터베이스의 변화를 즉각 반영한다. 


*Comment 클래스의 인스턴스를 만들 때 주의할 점 - 모든 필드에 데이터 값들이 들어가야한다.



블로그 이미지

쵸잇

,