본문 바로가기

Web Programming/Django

Word Counter 만들기

Word Counter 만들기


주제: View와 Template 간에 함수를 통해 데이터 가공해서 주고 받기

글귀를 입력하면 총 몇개의 단어로 구성되어 있는지 판단하여 알려주는 사이트 제작하기



사전 이론적 개념


템플릿 언어 - html 안에 쓰는 장고 제공 언어

{{ python_variable }} 파이썬 변수를 html 안에 쓰기 


템플릿 필터 - 템플릿 변수에 추가적인 속성 부여


1
2
3
HTML
{{ value | length }} # value의 길이 출력
{{ value | lower }} # value를 소문자로 출력
cs


템플릿 태그 - html 상에서 파이썬 문법 사용,  url 생성 등의 기능 제공


1
2
3
4
5
6
7
8
HTML
# 반복문
{% for students in class %}
    {{students}}
{% endfor %}
 
# URL 생성
{% url 'url_name' %}
cs


cf) 템플릿 상속



구성


Template

1. home

사용자로부터 입력 받음

결과 제출 버튼

about과 연결됨


2. about

관련 내용 공지

home과 연결됨


3. count

home으로부터 입력받은 데이터를 함수로 처리하여 결과 출력


View

views.py에 정의되어야 하는 함수

home을 띄우는 함수, about을 띄우는 함수, 

count에 전달할 함수!!(home에서 입력받은 데이터를 처리하는 함수)


Url

home을 띄우는 url - root 페이지

about을 띄우는 url - root/about

count를 띄우는 url - root/count


실습

가상환경 시작

python -m venv myvenv

source myvenv/Scripts/activate

project 시작하기

django-admin startproject firstproject

app 만들기

python manage.py startapp wordcount

Template 만들기

app/templates(폴더)/wordcount/home.html

app/templates(폴더)/wordcount/about.html

app/templates(폴더)/wordcount/count.html

app과 project 연결하기

app과 project를 연결하는 작업
반드시 끝에 , 를 포함하여야 한다.

1
2
3
4
5
# project/settings.py
INSTALLED_APPS = [
    ...
    'wordcount.apps.WordcountConfig',
]
cs

View 선언

template 파일을 띄워주는 함수를 views.py에 정의하기


1
2
3
4
5
6
7
# project/app/views.py
 
def home(request):
    return render(request,'wordcount/home.html')
 
def about(request):
    return render(request,'wordcount/about.html')
cs

URL conf 연결하기

url과 template 파일을 연결


1
2
3
4
5
6
7
8
9
# project/urls.py
import wordcount.views
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',wordcount.views.home, name="home"),
    path('/about',wordcount.views.about, name="about"),
    path('/count',wordcount.views.count, name="count"),
]
cs


HTML 내용 채우기

home 과 about은 단순 html 내용을 보여주는 template 파일이므로 이에 맞게 해당 내용을 채워준다.
여기서 <a href="{%url 'name' %}> 을 통해 url 생성 템플릿 태그를 활용할 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# project/app/templates/wordcount/home.html
 
<h1>WORD COUNT</h1>
 
<a href="{%url 'about' %}">ABOUT</a>
 
<form action="{%url 'count' %}">
    <textarea cols="40" rows="10" name="fulltext">
        <br>
    </textarea>
    <input type="submit" value="Count!"/>
</form>
 
# project/app/templates/wordcount/about.html
 
<h1>ABOUT</h1>
<p>멋쟁이 사자처럼 7기 윤신웅이 만든 작품입니다</p>
<p>단어를 세어주는 사이트 입니다</p>
 
<a href="{%url 'home' ">HOME</a>
cs

view Count  함수 처리

template 파일을 띄워주는 함수를 views.py에 정의하기

단, count의 경우 단순 띄워주는 것이 작업물을 python 언어로 처리해서 넘겨주어야 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# project/app/views.py
 
def count(request):
        full_text = request.GET['fulltext'# 총 문장 가져오기 
        word_list = full_text.split() # 단어 개수 세기
        # 횟수 총 세서 dictionary 자료형 객체 반환
        word_dictionary = {} 
        for word in word_list:
            if word in word_dictionary:
                # Increase
                word_dictionary[word] += 1
            else:
                # add to the dictionary
                word_dictionary[word] = 1
 
        # 반환
        return render(request, 'wordcount/count.html', {'fulltext': full_text, 'total'len(word_list), 'dictionary': word_dictionary.items()})
cs



HTML 내용 채우기

원하는 변수들에 대해서는
{}를 통해 가져올 수 있는데 우리가 render로 넘겨받은 것이 dictionary 객체이므로 키값을 통해 값을 가져온다.
따라서 {{키}}로 가져오므로 count.html 내용은 다음과 같이 처리된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# project/app/templates/wordcount/count.html
 
당신이 입력한 텍스트는 {{total}}<!--총단어수--> 단어로 구성되어 있습니다.</h1>
 
<a href="{% url 'home' %}"> 다시하기 </a>
 
<h1>입력한 텍스트: </h1>
<!-- 입력받은 전체 텍스트 -->
{{full}}
 
<h1>단어 카운트:</h1>
<!-- '단어' - '단어나온 횟수' -->
{% for word, countTotal in dictionary %}
{{ word }} - {{ countTotal }}
<br>
{% endfor %}
cs

Project 만들기

App 만들기

Project에 App 연결하기

Templates 폴더에 템플릿 파일 만들기

Views.py 에서 함수 작성

Urls.py 에서 url path 생성

'Web Programming > Django' 카테고리의 다른 글

Home & Detail (Blog 모델 상세 페이지)  (0) 2019.01.31
Model & Admin  (0) 2019.01.21
MTV 패턴  (0) 2019.01.08
Hello World 이론 & 실습  (0) 2019.01.08
Python & Django 설치 및 세팅  (0) 2019.01.08