ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WebPage] 3-3. 장고 프로젝트 시작 - 웹 페이지 제작 강좌
    Web/WebPage 2015. 6. 26. 13:54

    3.3.3 장고 프로젝트를 시작해 보자


     먼저 각종 장고 개발 연습을 할 연습용 폴더를 만들도록 하겠습니다. 






     폴더를 생성했으면 아래 명령을 입력합니다.


      django-admin.py startproject newproject 




     django-admin.py는 장고를 설치할 때 같이 설치된 장고 프로젝트 관리 프로그램입니다. 이 프로그램을 이용해서 장고 프로젝트를 설정하는 것입니다. 








     아래 명령어를 입력하여 새로 만든 프로젝트를 구동시켜 봅시다.


      cd newproject

      manage.py runserver



     아래와 같이 localhost:8000을 입력하여 뜬다면 성공한 것 입니다.










     1. 장고 설정

      

      장고의 설정은 프로젝트 이름과 같은 폴더(newproject)안에 있는 settings.py와 urls.py 파일을 설정하는 것으로 할 수 있습니다. settings.py는 장고 프로젝트에서 사용하는 각종 폴더 경로나 데이터베이스 설정, 언어 설정 등이 있습니다.


      urls.py주소를 만들어주는 역할을 합니다. php등의 언어를 접해본 분이라면 조금 생소한 개념일 수 있는데, mod_rewrite 등을 쓰지 않는다면 php나 jsp에서는 대부분 파일과 주소가 1:1로 대응합니다. 


      http://www.myhome.com 라는 서버가 있고, hello.php라는 파일이 있으면 => http://www.myhome.com/hello.php가 주소가 되는 겁니다.

     

      장고에서는 이런 방식이 아니라 urls.py를 이용해서 주소를 입맛대로 설정 할 수 있습니다.


      일단 urls.py를 아래와 같이 수정하여 관리자 모듈에 사용 할 수 있게끔 바꾸도록 하겠습니다.





    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    from django.conf.urls import patterns, include, url
     
    # Uncomment the next two lines to enable the admin:
    from django.contrib import admin
    admin.autodiscover()
     
    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'newproject.views.home', name='home'),
        # url(r'^newproject/', include('newproject.foo.urls')),
     
        # Uncomment the admin/doc line below to enable admin documentation:
        # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
     
        # Uncomment the next line to enable the admin:
        url(r'^admin/', include(admin.site.urls)),
    )
     
    cs



     


      다음은 settings.py를 부분부분을 보도록 하겠습니다.


      아래는 가장 중요한 부분이라고 할 수 있습니다. 데이터베이스를 설정해 주는 부분입니다. 장고에서 사용 할 데이터베이스의 경로를 저장해 주는 부분입니다. 우리는 ENGINE에 sqlite3을 추가하고 NAME에 sqlite3db라고 적겠습니다. 



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DATABASES = {
        'default': {
            'ENGINE''django.db.backends.sqlite3'# Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME''sqlite3db',                      # Or path to database file if using sqlite3.
            'USER''',                      # Not used with sqlite3.
            'PASSWORD''',                  # Not used with sqlite3.
            'HOST''',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT''',                      # Set to empty string for default. Not used with sqlite3.
        }
    }
    cs



      아래는 프로젝트에 설치된 APP들을 나타내는 항목입니다. 하나의 장고 프로젝트는 여러 개의 APP을 포함합니다. 이 APP은 장고에서 미리 제공하는 APP 일수도 있고 우리가 직접 만드는 APP일수도 있습니다. 이전에 admin 모듈을 활성화하기 위한 작업을 진행했으므로 아래 와 같이 수정해 줍니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # Uncomment the next line to enable the admin:
        'django.contrib.admin',
        # Uncomment the next line to enable admin documentation:
        # 'django.contrib.admindocs',
    )
    cs



      추후 추가할 APP이 있으면 위 소스코드의 방식대로 추가해주시면 됩니다.



      다음은 장고의 템플릿 경로를 적어주는 부분입니다. 장고에서는 템플릿을 만들어 놓고 그 템플릿에 적당한 값을 넣어서 사용자에게 보여주는 방식이었습니다. 아래 소스코드에서 실제 경로를 지정해주는 부분입니다. 


      먼저 소스를 수정하기 전에 newproject 폴더 안에 templates 폴더를 생성해 준 뒤, 아래처럼 소스를 수정합니다



     

     





    1
    2
    3
    4
    5
    6
    7
    8
    import os
    TEMPLATE_DIRS = (
        # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
        os.path.join(os.path.dirname(__file__), '..''templates'),
    )
     
    cs




      settings.py에는 없지만 하나 해주면 좋은 설정이 있습니다. 아래와 같은 부분입니다.


       

    1
    2
     
    FILE_CHARSET = 'euc-kr'
    cs




     2. 장고 APP 만들기

      

      설정이 끝났으면 이제 본격적으로 장고 APP을 만들어 보겠습니다. APP을 만들기 위해서는 프로젝트의 디렉터리로 가서 manage.py를 사용해야 합니다.


      manage.py startapp myapp








      APP을 생성했으니 settings.py에 INSTALLED_APP에 추가해줘야합니다. 아래와 같이 수정해주세요.




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # Uncomment the next line to enable the admin:
        'django.contrib.admin',
        'myapp',
        # Uncomment the next line to enable admin documentation:
        # 'django.contrib.admindocs',
    )
    cs







    3.3.4 데이터가 담기는 그릇, 모델(Model)

     

     우리가 어떤 프로그램을 만들 때는 아무리 간단한 프로그램이라도 데이터를 저장할 공간이 필요합니다. 장고에서는 ORM(Object-Relational Mapper)라는 기능을 통해 데이터베이스를 간단히 해소할 수 있습니다. 



     1. 모델의 생성과 접근


      모델은 장고 프로젝트에 속해있는 각 앱의 하위에 존재하게 됩니다. 즉 장고 프로젝트 폴더에서 manage.py startapp "앱이름"을 실행하게 되면 "앱이름" 폴더 안에 models.py라는 파일이 생기게 됩니다.


      그럼 models.py를 작성하여 확인해봅시다.



    1
    2
    3
    4
    5
    from django.db import models
     
    class Food(models.Model):
        name = models.CharField(max_length=65)
     
    cs



      간단하게 Food라는 모델을 만들었습니다. class Food(models.Model) 이라는 구문을 통해 models.Model을 상속받은 Food라는 객체를 만들었습니다. 작성된 모델을 토대로 데이터베이스에 적용해보도록 하겠습니다. 아래 명령어를 실행해주세요.


      manage.py syncdb


      관리자 모듈을 풀어놨기 때문에 계정 관련 문의를 묻습니다. 간단히 설정해주세요.







      모델이 정상적으로 생겼는지 확인하기 위해 접속을 합니다. 물론 서버를 실행하기 위한 manage.py runserver를 입력하신 후 에 말이죠.(localhost:8000)


      접속결과 아래와 같이 404를 배출합니다. 메인 페이지를 만들지 않았기 때문에 그렇습니다.







      관리자 계정으로 접속해서 확인을 하기 전에 admin.py 파일을 작성해서 관리자 페이지에서 Food를 확인 가능 하게 합시다.



    1
    2
    3
    4
    5
     
    from django.contrib import admin
    from myapp.models import *
     
    admin.site.register(Food)
    cs



       위 소스코드를 admin.py에 입력한 뒤, myapp 폴더 내에 저장해주시고, localhost:8000/admin으로 접속합니다. 간단한 로그인 화면에서 아까 입력한 계정 입력하여 접속합니다.

     

       아래 처럼 Food 모델이 있는 관리자 모듈이 보입니다. ( * 보이지 않을 경우, Server를 종료 한 뒤 재시작 해주세요)







      위 화면에서 Foods에  + Add를 눌러 Banana와 Apple를 생성해보도록합시다.



      생성한 banana와 apple을 확인하기 위해 장고 쉘(Shell)을 열어 확인합시다. 새로운 cmd 창을 열어서 manage.py가 있는 경로까지 진입하여 아래 명령어를 칩니다.


      manage.py shell



     




       장고 쉘에서 우리가 만든 모델을 가져오려면 from "APP이름".models import * 를 실행하면 됩니다. 



       아래 처럼 입력된 모델에 대해 확인이 가능합니다.







      모델.objects.all()을 통해 데이터들을 리스트의 형태로 가져올 수 있습니다. 이 데이터를 조작하려면 원하는 필드에 새로운 값을 넣은 뒤 .save()를 호출하면 모델이 업데이트 됩니다. food = Food() 와 같이 모델의 인스턴스를 만든 뒤 값을 넣어주고 .save()를 호출하면 새로운 데이터를 집어 넣을 수 있고, .delete()를 호출하면 데이터를 지울 수 있습니다.








     * Tip 모델에 이름을 주자

      

      모델이 <모델명: 모델명 object>와 같이 나와 무슨 모델인지 알기 어렵습니다. 

      models.py에서 해당 모델에 대해 아래와 같은 방식으로 추가해주면 식별이 쉽게 됩니다.


      

    1
    2
    3
    4
    5
    6
    7
    8
    from django.db import models
     
    class Food(models.Model):
        name = models.CharField(max_length=65)
     
        def __unicode__(self):
            name = "food : %s" %(self.name, )
            return name
    cs











     2. 원하는 모델만 얻어 오는 방법


      1) 모든 객체 가져오기(all)

      

       - 모든 객체를 가져오기 위해서는 Food.objects.all()과 같이 objects.all() 함수를 사용하면 됩니다. 

       - 함수를 사용하면 리스트 형태로 객체를 가져오게 됩니다.

       - 물론 Food.objects.all()[:10] 이나 Food.objects.all()[10:20] 처럼 슬라이싱하여 원하는 위치의 데이터를 가져올 수 있습니다.




      2) 원하는 조건에 따라 가져오기(filter)

      

       - 원하는 조건으로 모델 객체들을 가져오려면 filter 함수를 사용하면 됩니다.



    1
    2
    Food.objects.filter(condition)
     
    cs

     


       - Food에서 name이 orange인 객체만 가져오고 싶다면 아래처럼 사용하시면 됩니다.


        Food.objects.filter(name="orange")


      

     조건

     의미 

     사용 예제 

     __startswith 

     ~으로 시작하는 값 

     name__startswith="kim" 

     __contain 

     ~을 포함하는 값 

     name__contain="pp" 

     __in  

     ~중에 하나 

     id__in=[1,2,3] 

     __endswith 

     ~으로 끝나는 값 

     name__endswith='jun 

     __regex 

     정규식에 맞는 값 

     name__regex=r'^(An?|The) +' 

     __lt 

     작을 때 

     price__lt=1000 

     __lte 

     작거나 같을 때 

     price_lte=1000 

     __gt 

     클 때 

     price_gt=1000 

     __gte 

     크거나 같을 때 

     price_gte=1000 

    Filter를 위한 조건들 



       - 만약 name이 'kim'으로 시작하고 price가 100이하인 필드를 가져오고 싶으면 .objects.filter(name__startswith='kim').filter(price__lte=100)) 으로 하면 됩니다.





      3) 가져온 데이터 정렬하기(order)

      

       - 가격 순 정렬이나 번호 순 정렬이 필요한 경우 objects.order_by와 같이 사용하여 정렬합니다.

       - name으로 정렬하고 싶다면, objects.order_by('name')과 같이 적용하고 싶은 필드로 해주시면 됩니다.

       - 내림차순은 필드명 앞에 '-'를 붙여 주시면 됩니다.






     3. 모델의 여러 자료형들


      1) CharField

        - 문자열을 담을 수 있는 필드입니다.

       - CharField는 길이 제한이 있으므로 길이 제한이 없는 필드로 지정할 시에는 TextField를 사용해야 합니다.  





      2) TextField

        - 긴 문자열을 담을 수 있는 필드입니다. 

       - 신문의 기사나 블로그 포스트, 게시판의 글처럼 길이가 얼마나 늘어날지 모르는 경우 사용합니다.




      3) IntegerField

        - 정수를 담을 수 있는 필드입니다.



      4) FloatField

        - 실수를 담을 수 있는 필드입니다.



      5) BooleanField

        - 참, 거짓을 저장 할 수 있는 필드입니다.



      6) DateField

        - 날짜를 저장할 수 있습니다.

       - 옵션 중에 auto_now는 사용자가 값을 입력하지 않아도 자동으로 save()가 호출될 때의 날짜가 들어가게 됩니다.



      7) TimeField

        - 시간을 저장할 수 있습니다.



      8) DateTimeField

        - 날짜와 시간을 동시에 저장합니다.




     

     1. blank


      이 옵션은 빈 값을 허용하겠냐는 의미의 옵션입니다. 기본 값은 False 입니다. 예를 들어 models.CharField(max_length=128, blank=True)로 잡아주면 빈 값이 들어가도 괜찮다는 뜻 입니다.


     

     2. null

     

      이 옵션은 blank와 유사합니다. 빈 값을 데이터베이스에 NULL로 저장할 것인지를 의미하는 옵션입니다. blank가 장고에서 검사 해주는 항목이면 null은 데이터베이스에서 검사해주는 항목입니다.



     3. default


      필드에 들어가는 기본 값을 설정해 줄 수 있습니다.



     4. editable

      

      editable을 False로 설정하면 그 필드는 관리자 화면이나 장고에서 자동으로 생성해 주는 폼에 나타나지 않습니다.


     

     5. unique


      unique가 True인 필드는 그 테이블(모델)에서 하나의 유일한 값만을 가질 수 있습니다.


     

     모든 필드에 적용할 수 있는 옵션들






     지금까지 살펴본 Field를 통해서 Food 모델을 개량해 보겠습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from django.db import models
     
    class Food(models.Model):
        name = models.CharField(max_length=65)
        
        price = models.IntegerField(default=1000)
        calorie = models.FloatField()
        is_fruit = models.BooleanField(default=True)
        memo = models.TextField(blank=True)
        
        def __unicode__(self):
            name = "food : %s" %(self.name, )
            return name
    cs



     manage.py syncdb를 한 뒤 관리자 화면에서 확인해보도록 하겠습니다.


     관리자 화면에서 add를 눌러 입력 후 저장을 누르면 에러가 납니다.











      이러한 문제는 기존에 존재하는 테이블 때문 입니다. 기존의 테이블을 지운 뒤, 다시 syncdb를 해주어야 합니다. PC 내에서 기존의 DB를 지워주세요. (newproject에 보시면 sqlite3db 를 지우시면 됩니다.) 


      지우신 후 다시 syncdb를 수행하여 페이지에서 잘 입력되는 지 확인합니다.







     4. 모델간의 관계를 주자


      우리는 지금까지 모델이 하나만 있는 상황을 만들었습니다. 하지만 실제로 무엇이든 해보려고 한다면 모델이 하나로 끝나지 않을 겁니다. 가장 간단하게 회원 정보에 대한 모델도 있어야 하고 게시판이라면 게시물에 대한 모델 그리고 코멘트에 대한 모델까지 필요하겠죠. 우리도 Food 모델말고 Store 모델을 생각 해 볼 수 있습니다. 먹을 것을 파는 가게를 뜻합니다.



     아래는 간단한 Store 모델입니다.


    1
    2
    3
    4
    class Store(models.Model):
        name = models.CharField(max_length=128)
        items = models.TextField()
     
    cs





      위와 같이 작성된 Store를 통해 기존 Food 모델과 관계를 맺을 수 있습니다. 장고에선  ForeignKey, OneToOneField, ManyToManyField 라는 필드를 제공합니다.





     * 본 포스팅은 이재근 등 4명 저 "Fast Web Service Build up: 웹 서비스를 쉽고 빠르게 구축하는 기술" 저서를 참고하여 작성하였습니다

    댓글

Designed by Tistory.