지난 포스트(https://practice-a-lot.tistory.com/42)에서 "related_name" 치트를 활용하는 방법을 보았다.


그에 대한 연장선으로 view에서 comment_list를 만들어줄 필요 없이 템플릿 자체에서 구현하는 방법을 볼 것이다.

먼저 view에서 작성한 comment_list를 삭제한다 


1
2
3
4
5
6
def detail(request, article_id):
    article = Article.objects.get(id=article_id)
    ctx = {
        "article" : article
    }
    return render(request, "detail.html", ctx)
cs



comment_list를 삭제했지만 comment 데이터는 article 인스턴스에 고스란히 담겨있다.

지난 포스트에서 했던 것처럼 템플릿에서도 article 인스턴스에 접근하여 comment_list를 뽑아내면된다. 



1
2
3
4
5
<div>
   {% for comment in article.article_comments.all %}
   <div>{{ comment.username }} : {{ comment.content }}</div>
   {% endfor %}
</div>
cs



뷰에서 삭제한 comment_list의 값을 템플릿에서 그대로 사용했다. all 다음에 ()를 쓰지 않는다. 함수가 아니므로.


Comment 테이블의 article 필드에서 쓰인 "related_name" 치트가 ForeignKey로 연결된 Article 테이블에서 역으로 Comment 테이블에 접근하게 된다.  

블로그 이미지

쵸잇

,

결과보어

외국어/중국어 2018. 11. 22. 19:15

어떠한 동작의 결과를 보충 설명해주는 기능을 한다.


1. 成 

- 주어 + 동사 + 成 + 목적어 형태

- 주어+동사를 먼저 해석하고, 成+목적어를 이어서 ("~으로"라는 뜻으로) 해석 


都换成韩币。(Dōu huàn chéng hánbì) 모두 바꿨다 한국돈으로 ▶ 모두 한국돈으로 바꿨다

头发都变成红色了。(Tóufǎ dōu biàn chéng hóngsèle) 머리카락이 모두 변했다 빨간색으로 머리카락이 전부 빨간색으로 변했다


2.


1) "~까지"로 해석

成와 같은 방식으로 해석


您寄到哪里?(Nín jì dào nǎlǐ) 너 부치다 어디까지 ▶ 어디까지 부치시나요?

我们学到第六课了。(Wǒmen xué dào dì liù kèle)우리는 배웠다 6과까지 ▶ 우리는 6과까지 배웠다.


 2) "드디어 ~하다"로 해석


我已经收到你的邮件了。(Wǒ yǐjīng shōu dào nǐ de yóujiànle.) (직역하면 난해해져 찾아본 결과로 번역함) 나는 메일을 받았다

昨天我见到张京。어제 나는 드디어 장경을 만났다.

 

3. 

- "다 ~했다"로 해석


我看完了你的作文。나는 다 봤다 너의 글을 ▶ 나는 너의 글을 다 봤다

我写完作业了。나는 다 했다 숙제를 ▶ 나는 숙제를 다 했다.


4. 

- 잘못 ~했다


这个字写错了,你再写一下。이 글자를 잘못 썼어, 너 다시 한번 써.

你打错电话了。 당신 전화 잘못 걸었다.


5. 

- ~하고 없다


钱都花光了。돈을 모두 쓰고 없다.

衣服都卖光了。옷 전부 팔고 없다.


6. 

- 잘 ~하다


我吃好了晚饭。나는 잘 먹었다 저녁을 ▶ 나는 저녁을 잘 먹었다.

我爱人洗好了衣服。내 애인은 잘 세탁했다 옷을 ▶ 내 애인은 옷을 잘 세탁했다  


7. 

- ~을 이해하다


我的话你听懂了吗? 내 말 너는 듣고 이해했니?

你看懂这本书了吗?너는 이해했니 이 책을?


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

조동사 会 파헤치기  (0) 2018.11.30
중국어의 Because (因为~, 所以~)  (0) 2018.11.23
조동사 可以  (0) 2018.11.20
정도보어(상태보어)와 得  (0) 2018.11.19
기초문법 (4) - 방위사  (0) 2018.10.20
블로그 이미지

쵸잇

,

Article

id

title

content

category

hashtag(ManyToMany(Hashtag__name)) 

1

자바

안드로이드 따라하기 시작

dv

java, android

2

파이썬

장고 배달의 민족 클론하기

dv

python, django

(Aritlce 테이블)


단독 게시글 페이지(상세페이지)에서 댓글 리스트를 출력하고 싶은데,

댓글 테이블에서는 게시글이 다대일 관계로 접근이 가능한데, 역으로는 접근가능한 방법이 없다.


이를 해결하는 방법



Comment 

id

article(ForeignKey(Article))

name

content

1

1

Ryan

좋은 시작이야

2

2

Adrianne

I'm so relieved that you've come to your senses 

 3

2

Jack

나는 어렵더라 

 4

1

Paul

Good job man~


Ariticle 테이블과 Comment 테이블은 다대일 관계를 맺고 있다.


테이블을 살펴보면, Comment 테이블에서 Article 테이블로 접근이 가능하다. 

그러므로 Article 테이블의 데이터를 유용하게 옮겨 쓸 수 있다.


그런데, 반대로 Article 테이블에서 Comment 테이블의 데이터를 가져오려해도 접근 방법이 보이지 않는다.


이를 위해 Comment 테이블의 article 필드에서 "related_name" 치트를 사용하여 Article 테이블에서의 접근을 허용한다.



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


1
2
3
4
5
6
7
def detail(request, article_id):
    article = Article.objects.get(id=article_id)
    comment_list = article.article_comments.all(article__id=article_id)
    ctx = {
        "article" : article,
        "comment_list" : comment_list,
    }
cs


*ORM 사용시 Article 테이블에서 id 필드로 접근하려면 __ (더블언더바)를 반드시 사용해야한다.

블로그 이미지

쵸잇

,

Article 

 id

title

content

category 

 1

놀러와 

오늘 친구들이 놀러왔다

일기 

 2

혼나다 

게임을 많이해서 부모님께 혼이 났다

일기 


Hashtag 

 id

name 

 1

플스4

 2

위닝2019 

 3

중고나라 



게시글은 해시태그를 3개 중에 아무거나 다 써도 된다.

해시태그도 어떤 게시글에 쓰여도 무방하다. 

서로 중복사용 가능하다. 상호종속관계로 이루어져있다.


Ariticle and Hashtag 

id

Article(ForeignKey)

Hashtag(ForeignKey)

 1

1

 2

1

 3

2

 4

2

 5

2


테이블을 새로 만들면 해당 형태로 완성된다.

두 개 필드 모두 FK로 관계를 설정해서 사용해도 되는데, 게시글에 해시태그 필드를 만들어서 ManyToMany 관계를 설정하면 더 간편하다.


1
2
class Hashtag(models.Model):
    name = models.CharField(max_length=50)
cs
1
2
3
class Article(models.Model):
    (생략)
    hashtag = models.ManyToManyField(Hashtag)
cs


해시태그 테이블을 만들었다.

게시글 테이블에 새로운 필드를 만들고, Hashtag 테이블과 ManyToMany관계를 형성한다.


1
2
hashtag = request.GET.get("hashtag")
article_list = Article.objects.filter(hashtag__name=hashtag)
cs


주소창에서 해시태그의 값을 가져와 변수에 담는데,

필터 사용시 일반 필드와 다른 점이 있다.

게시글 테이블의 해시태그 필드는 해시태그 테이블과 ManyToMany관계로 만들어진 것이다.

ORM대로 게시글 테이블에서 바로 접근할 수 있도록 (hashtag=hashtag) 형태로 필터하고싶으나,

인자를 찾지 못하는 오류가 발생하므로,

해시태그 테이블의 name 필드에 접근하는 (hashtag__name=hashtag) 형태로 필터를 한다.



블로그 이미지

쵸잇

,

일과에 데드라인을 설정해 효율적으로 시간 활용을 하고, 집중력을 끌어올린다.


하루 일과를 9시부터 5시까지 정한다면, 반드시 지켜야할 일과(수업, 식사, 운동 등)를 제외한 중요 업무(시험, 공부)에 몰입한다.

이후 나머지 시간은 본인 취미활동을 즐긴다.


데드라인 원칙


1) 우선순위가 높은 과제를 파악한다.


2) 과제에 들어갈 시간을 추정한 후 빠듯한 시한을 설정하라.

- 시한을 공개적으로 밝히는 것이 좋다. (프로젝트 준비한다면 날짜를 미리 사람들에게 고지)

- 또는 휴대전화에 카운트를 설정해 동기부여한다.


3) 처음이라면 일주일에 한 번만 시도하며 훈련을 거친다.

- 데드라인을 설정하면 은근 스트레스가 작용한다. 따라서 익숙해지기까지 횟수를 급히 늘리지 않는다.

- 요령이 붙기 시작하면 데드라인 설정 빈도를 늘리면 좋다.


'독서 > 일반서적' 카테고리의 다른 글

딥워크 (1) - 인터넷의 유혹에서 버티기  (0) 2018.11.21
블로그 이미지

쵸잇

,

인터넷을 쓰는 시간을 정해 두고 나머지 시간은 일체 쓰지 않는다.

인터넷을 사용할 시간을 메모한다. 반드시 그 시간을 지킨다.


인터넷 사용은 집중력을 줄이지는 않는데, 

기존에 공부를 하며 저자극/고가치 활동을 하다가,

인터넷이라는 고자극/저가치 활동을 하게 되면 이후에 두뇌는 지속적인 자극을 원하게 된다.

(여기서 인터넷은 각종 뉴스, 유투브, 검색, SNS 활동을 뜻한다)

이처럼 잦은 인터넷 사용은 집중을 요하는 정신적 근육을 약화시킨다.


예를 들어,

인터넷을 1시간 후에 쓸 예정이다.

그 전에 지루한 시간이 이어져 인터넷 사용을 갈구할 것이다.

이 인터넷 욕구를 참는 것이 집중력 훈련에 속한다.



내가 생각해도 저자가 내세운 이 전략은 실효성이 있을지 의문스럽다. 

이어서 저자가 말하는 요점 3가지.


1. 인터넷을 쓰는 시간까지 참아라.


업무상 사용하는 건 괜찮다. 단, 업무외 사용은 반드시 정해진 시간에만 사용한다.


2. 인터넷의 유혹에서 견뎌라. (난 이 의견 반댈세)


급히 인터넷에서 정보를 찾아야하는 상황, (저자: 난 참아야해), 이 선을 자꾸 넘으면,

결국에는 인터넷 구간과 오프라인(비인터넷) 구간의 구분이 흐려진다.

업무가 막히더라도 이 시간을 참아라. 그냥 쉬어라. 그리고나서 인터넷을 사용해라.


좋다. 정말 급하다면 인터넷 시간을 변경할 수 있다.

단, 즉시 시작하는 것이 아니라 5분 이상의 간격을 두고 사용하라.

5분을 버틴다고 업무가 혼란이 생기는건 아니다.

다만 이러한 행동은 행동학점 관점에서 보면 중대한 의미를 지닌다.

인터넷 욕구와 실제로 쓰는 데서 얻는 보상을 분리하기 때문.


3. 퇴근 후에도 인터넷 사용 간을 정해 둔다.


퇴근 후 저녁이나 주말에 스마트폰이나 노트북으로 인터넷에 매달린다면,

그 다음날 출근해서 두뇌의 상태를 바꾸는데 많은 노력이 들 것이다.

따라서 일과 후에도 이 규칙을 그대로 유지해야한다.


대신 약속을 잡는 연락이나 정보 확인(맛집 검색)은 허용된다.

이외에는 휴대폰을 멀리한다.


특히 어려운 경우는 어쩔 수 없이 기다려야할 때다.

무료하지만 참아야한다. 집중력 훈련 관점에서는 중요한 일이므로.



딥워크를 위해서는 반드시 필요한 행위다.


나도 오랜기간 기본데이터 550MB인 요금제를 사용하며 인터넷 사용을 최소화한다.

집에서도 휴대폰 사용을 멀리해서 주변에서 전화를 바로 안받는다고 욕먹기 일쑤였다. 지금도.

그러나 가끔 집 와이파이를 사용하며 무언가에 꽂히면 걷잡을 수 없이 빠져든다.

특히 주말에 무료할 때 그렇다. 조금 반성해야겠음을 깨달았다.

'독서 > 일반서적' 카테고리의 다른 글

딥워크 (2) - 데드라인의 힘  (0) 2018.11.21
블로그 이미지

쵸잇

,

블로그를 따라 만드는 중에 카테고리 페이지를 구현하는데서 막혔다. 


이를 공부하다보니 카테고리 리스트 구현이 궁금해 뒤돌아가서 익히고,


카테고리 테이블이 별도로 없는 걸 다시 알고 모델도 또 공부했다.


공부하고 잊히고 다시 알게 되는 중이다. 알고보니 내가 대충 공부했던 것이다.


역으로 공부했으니 복습은 정방향으로 기록하겠다.


1. 카테고리는 게시글 테이블에 선택 가능한 필드 형태로 넣는다.


Article

id

title

content

category

1

안녕

놀러와

development / personal 중에 선택


블로그에서 게시글 테이블은 제목, 내용, 카테고리만 입력하도록 만들었다.


단, 카테고리는 둘 중 하나 선택하도록 추가적인 설정을 해주었다. 


choice 필드에 대한 자료(https://docs.djangoproject.com/en/2.1/ref/models/fields/)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Article(models.Model):
    DEVELOPMENT = "dv"
    PERSONAL = "ps"
    CATEGORY_CHOICES = (
         (DEVELOPMENT, "development"),
         (PERSONAL, "personal"),
    )
 
    title = models.CharField(max_length=200)
    content = models.TextField()
    category = models.CharField(
         max_length=2,
         choices=CATEGORY_CHOICES,
         default=DEVELOPMENT
    )
cs


2. View에서 카테고리 리스트를 만든다.


article_list는 ORM으로 모든 게시글 데이터가 담긴 변수이다.

(ORM(Object-Relational Mapping)은 애플리케이션과 데이터베이스 간의 데이터 처리를 추상화하여 다룰 수 있는 편리한 방법)

카테고리는 메소드를 통해 풀네임을 변수에 담았다. 


1
2
3
4
category_list = set([
    article.get_category_display()
    for article in article_list
])
cs


3. Templete에서 카테고리 리스트 매핑하기 


1
2
3
{% for category in category_list %}
<li>{{ category }}</li>
{% endfor %}
cs


아직 링크가 걸려있지 않아서 카테고리로서의 기능은 없다.


4. View에서 해당 카테고리만의 게시글 리스트 만들기


GET 방식은 웹브라우저에서 주소창에 입력하여 서버에 데이터를 요청하는 것이다.


네이버에서 무언가를 검색하면 주소창에 /?query=무언가 형태로 작성된 것이 보이는데,


쿼리스트링의 형태로 서버에 데이터를 요청하여 검색페이지가 출력되는 것이다.


이를 카테고리에 비슷하게 적용할 수 있다.


1
category = request.GET.get("category")
cs


주소창에서 /?category=dv 또는 /?category=ps 형태의 쿼리스트링은 딕셔너리 형태로 구성되어있다. 


여기서 밸류값인 dv 또는 ps를 가져오기 위해 작성한다. 그럼 변수 category에 담길 것이다.


1
article_list = Article.objects.filter(category=category)
cs


변수 값으로 필터하여 카테고리에 따라 게시글 리스트를 만들 수 있게 되었다.


5. 카테고리에 링크를 걸기 위해 전면 수정


1) View에서 카테고리 리스트 수정


1
2
3
4
category_list = set([
    article.category, article.get_category_display()
    for article in article_list
])
cs


축약형을 리스트에 새로 넣었다. 카테고리 주소에서 단축형로 쓰이므로


2) Templete에서 카테고리에 링크 걸기


1
2
3
{% for alias, category in category_list %}
<li><a href="/{{ alias }}/">{{ category }}</a></li>
{% endfor %}
cs


단축형, 정식형 순으로 변수로 지정되었으므로 매핑된 경우에도 순서대로 값이 반영된다.






블로그 이미지

쵸잇

,

조동사 可以


1. 가능을 뜻하는 "할 수 있다"를 말한다. 


他可以开车 그는 운전할 수 있다

我们可以再见他。우리는 그를 다시 만날 수 있다. 


*부정형은 不能 으로 써야한다.

不能开车 그는 운전할 수 없다


2. 허락을 뜻하는 "해도 된다"를 말한다


你可以休息 너는 쉬어도 된다

你不可以休息 너는 쉬면 안된다


A: 我可以去他家玩吗? 나 그 사람 집에 놀러 가도 될까요?

B: 可以 / 不可以 응 / 안 돼


A: 我可(以)不可以上网? 나 인터넷 해도 돼?

B: 可以 / 不可以 응 / 안 돼


예문


我可以去你家吗?나 너네집에 가도 돼?

这儿不可以坐。여기에 앉으면 안 돼

他不可以来学校。그는 학교에 오면 안 돼

你可以吃很多菜。너는 음식 많이 먹어도 돼


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

중국어의 Because (因为~, 所以~)  (0) 2018.11.23
결과보어  (0) 2018.11.22
정도보어(상태보어)와 得  (0) 2018.11.19
기초문법 (4) - 방위사  (0) 2018.10.20
기초문법 (3)  (0) 2018.10.05
블로그 이미지

쵸잇

,

정도보어(상태보어)란?


술어(동사·형용사)의 상태, 동작정도를 보충해서 설명해주는 문장 성분이다.


我说汉语。


주어와 술어만으로 표현된 문장으로는 화자의 "중국어 수준"을 알 수 없다.

중국어에서는 이 "수준"을 부가적으로 설명하기 위해서는 술어 다음에 得(de)를 붙이고 "수준"에 대한 수식어 덧붙인다.


我说汉语不怎么样。

정도보어 得는 목적어(汉语)가 아니라 술어(说) 뒤에 위치하여 술어를 보충 설명하는 것이다.


我说汉语说得不怎么样。(我说汉语 + 说得不怎么样) 

쪼개서 해석하면, 나는 중국어를 말한다 + 말하는 정도는 나쁘지 않다 ▶ 나는 나쁘지 않은 정도로 중국어를 말한다



실생활에서는 술어(说)의 중복사용을 피하지만, 정도보어(得) 앞의 술어를 빼서는 안된다.

我汉语说得不怎么样。내 중국어는 나쁘지 않은 정도이다.




我吃得很好。내가 먹는 정도는 아주 좋다 ▶ 나는 잘 먹는다

房间里冷得受不了(Shòu bùliǎo)。방 안의 추운 정도는 참을 수 없다 ▶ 방 안은 참을 수 없을 정도로 춥다

她歌唱不错(bùcuò)。그녀의 노래 부르는 정도는 좋다  그녀는 노래를 잘 부른다

她汉语说得很流利(liúlì)。그녀의 중국어 말하는 정도는 매우 유창하다 그녀는 중국어를 매우 유창하게 말한다

他英语说得不好。그의 영어 말하는 정도는 좋지 않다 그는 영어를 잘 못한다

我跑得不快。내가 달리는 정도는 빠르지 않다 나는 달리기가 빠르지 않다

他英语说得好吗?그의 영어 말하기 정도는 좋아? 그는 영어를 잘 말하니?

跑得快不快? 그가 달리는 정도는 빠르니? ▶ 그는 달리기가 빠르니?


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

결과보어  (0) 2018.11.22
조동사 可以  (0) 2018.11.20
기초문법 (4) - 방위사  (0) 2018.10.20
기초문법 (3)  (0) 2018.10.05
기초 문법 (2)  (0) 2018.10.03
블로그 이미지

쵸잇

,

UI 설계


테이블 설계 - 모델 코딩(데이터 구조 설계)


뷰 및 템플릿 코딩

- 요청에서부터 응답까지의 처리 흐름에 대한 로직 설계가 필요


URL - View - Template 의 로직 구조 설계


CRUD

Create, Read, Update, Delete


폼 처리하기

- 폼은 사용자로부터 입력을 받기 위해 사용한다

- 서버 시스템의 상태를 건드리냐 아니냐에 따라 POST/GET 방식으로 나뉜다

블로그 이미지

쵸잇

,