ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 장고 블로그 앱 만들기
    기타/파이썬 2021. 1. 8. 16:55

    1. settings 파일에 앱을 추가한다. 

    INSTALLED_APPS = [
    	#블로그 앱을 추가
        'blog.apps.BlogConfig',
    ]

     

    2. blog앱을 생성하고 models.py 작성

    class 모델이름(models.Model):
        필드이름1 = models.필드타입(필드옵션)

    필드는 데이터베이스에셔 테이블 열을 의미한다.

    단 필드 이름을 (clean, save, delete)같은 모델 API와 동일한 이름을 주면 안된다.

     

    Model은 데이터 서비스를 제공하는 레이아웃이다.

    여기에 사용되는 변수는 테이블 컬럼 메타 데이터를 정의한다.

    만약 컬럼이 추가 될 경우 꼭 마이그레이션을 해줘야 테이블에 반영이 된다.

     

    class Post(models.Model):
    title = models.CharField(verbose_name='TITLE', max_length=50)
    slug = models.SlugField('SLUG', unique=True, allow_unicode=True, help_text='one word for title alias.')
    description = models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple description text.')
    content = models.TextField('CONTENT')
    create_dt = models.DateTimeField('CREATE DATE', auto_now_add=True)
    modify_dt = models.DateTimeField('MODIFY DATE', auto_now=True)

    데이터베이스 필드 이름은 소문자와 밑줄로 표기한다.

     

    CharField - TextInput

    문자열 데이터를 저장하는 필드

    (max_length) 최대 글자 수를 반드시 지정해주어야한다.

     

    SlugField

    제목의 별칭, 포스트를 설명하는 핵심 단어의 집합

    pk를 사용하면 숫자로만 되어 뜻을 유추하기 어렵지만 슬러그는 단어들이라 이해하기 쉽다.

    디폴트 길이는 50이다.

    unique옵션을 이용해 특정 포스트를 검색할 때 기본 키 대신 사용된다.

     

    allow_unicode - 한글 처리가 가능하다.

     

    blank - 공백이 가능하다(필수 입력이 아니다)

     

    help_text - 컬럼의 설명

     

    TextField - Textarea

    max_lengh 값을 지정하면 폼에서는 글자 수가 제한되지만 데이터베이스에는 영향을 주지 않는다.

     

    DateTimeField - TextInput

    두개의 textinput, 달력위젯, 오늘 날짜 입력 기능을 기본 제공한다.

     

    auto_now_add - 생성시 현재 시간 자동 저장, 기본값을 재정의 할 수 없다

    auto_now - 저장될 때마다 자동으로 필드를 현재시간으로 설정

     

        class Meta:
            verbose_name = 'post'
            verbose_name_plural = 'posts'
            db_table = 'blog_posts'
            #'-' 내림차순 표시
            ordering = ('-modify_dt',)

    class Meta

    클래스의 클래스

    클래스가 동작하는 방식을 정의한다

     

    verbose_name

    사용자가 읽기 쉬운 모델 객체의 이름으로 관리자 화면에 표시된다

     

    verbose_name_plural

    verbose_name과 동일하나 복수형이다

    verbose_name 옵션을 지정하지 않으면 verbose_name에 s를 붙인다.

     

    db_table

    데이터베이스 테이블의 이름을 정의한다.

     

    ordering

    모델의 정렬 순서를 지정하며 기본 오름차순이다.

    앞에 '-' 을 붙이면 내림차순으로 정렬된다.

     

        def __str__(self):
            return self.title
        
        def get_absolute_url(self):
            return reverse('blog:post_detail', args=(self.slug,))
        
        def get_previous(self):
            return self.get_previous_by_modify_dt()
        
        def get_next(self):
            return self.get_next_by_modify_dt()
    

    def는 함수/메서드라는 뜻이다.

     

    __str__()

    모델 클래스의 객체 문자열 표현을 리턴한다.

    디폴트 값은 모델명 object이다.

    디폴트 문자열인 경우 객체를 알아보기 어렵기 때문에 정의해 주는 것이 좋다.

     

    get_absolute_url()

    어떠한 모델에 대해 detail 뷰를 만들게 되면 무조건 선언

    이 메소드가 정의된 객체를 지칭하는 url을 반환한다

    장고 내장 함수인 *reverse()를 호출한다

     

    reverse()

    파이썬 코드 안에서 URL 템플릿 태그와 비슷하게 동작하는 기능

    urls.py에서 설정한 URL의 name이나, viewname을 통해서 다시 URL로 되돌릴 수 있다

    인수가 있는 URL이라면 *args를 포함할 수 있다

    *kwargs로 전달하는 것 또한 가능하지만 args와 동시에 전달 할 수 없다.

    일치하는 URL이 없으면 NoReverseMatch 에러가 발생한다.

     

    *args

    *arguments(인수)의 줄임말이다

    그래서 꼭 저 단어를 쓸 필요 없이 *myNames라고 적어도 된다

    이 지시어는 여러 개(복수개의) 인자를 함수로 받을 때 쓰인다

     

    **kwargs

    keyword argument의 줄임말로 키워드를 제공한다

    '키워드': '특정 값' 으로 함수 내부에 전달

     

     

    3. 관리자에서 볼 수 있도록 admin.py 작성

    from .models import 내가 만든 모델
    
    @admin.register(내가 만든 모델)
    @admin.register(Post)
    class PostAdmin(admin.ModelAdmin):
        list_display = ('id', 'title', 'modify_dt', 'tag_list')
        list_filter = ('modify_dt',)
        search_fields = ('title', 'content')
        prepopulated_fields = {'slug' : ('title' , )}
        
        def get_queryset(self, request):
            return super().get_queryset(request).prefetch_related('tags')
        
        def tag_list(self, obj):
            return ', '.join(o.name for o in obj.tags.all())

    admin.ModelAdmin 상속을 통해 커스터마이징을 할 수 있다.

     

    list_display = Admin목록에 보여질 필드 목록

    list_display_links = 목록내에서 링크로 지정할 필드목록 (지정하지 않으면 첫번째 필드에만 링크가 적용)

    list_filter = 필터 옵션을 제공할 필드 목록
    search_fields = 검색박스를 표시하고 입력된 단어는 정의한 컬럼에서 검색한다
    prepopulated_fields = 지정된 필드는 정의한 필드를 사용해 채워지게 만든다

     

     

    4. urls 설정

    app_name = 'blog'
    urlpatterns = [
        path('', views.PostLV.as_view(), name='index'),
      
        path('archive/', views.PostAV.as_view(), name='post_archive'),
        path('archive/<int:year>/', views.PostYAV.as_view(), name= 'post_year_archive'),
        path('archive/<int:year>/<str:month>/', views.PostMAV.as_view(), name='post_month_archive'),
        path('archive/<int:year>/<str:month>/<int:day>/', views.PostDAV.as_view(), name='post_day_archive'),    
        path('archive/today/', views.PostTAV.as_view(), name='post_today_archive'),
    
    ]
    

    app_name

    url의 name값 중복을 방지하기 위해서 네임스페이스를 사용한다.

    ex) blog:index

     

    5. view코딩

    class PostLV(ListView):
        model = Post
        template_name = 'blog/post_all.html'
        context_object_name = 'posts'
        paginate_by = 2
        
    class PostDV(DetailView):
        model = Post
        
    class PostAV(ArchiveIndexView):
        model = Post
        date_field = 'modify_dt'
        
    class PostYAV(YearArchiveView):
        model = Post
        date_field = 'modify_dt'
        make_object_list = True
        
    class PostMAV(MonthArchiveView):
        model = Post
        date_field = 'modify_dt'
        month_format = '%m'
        
    class PostDAV(DayArchiveView):
        model = Post
        date_field = 'modify_dt'
        month_format = '%m'
        
    class PostTAV(TodayArchiveView):
        model = Post
        date_field = 'modify_dt'

    ListView - 조건에 맞는 객체 목록을 출력

    DetailView - 조건에 맞는 하나의 객체를 출력

     

    model - 조건을 검색할 모델이름

    template_name - 검색결과를 보여줄 페이지

    context_object_name - 뷰에서 템플릿 파일에 전달하는 컨텍스트 변수 이름

    paginate_by

    ListVeiw와 날짜 기반 뷰에서 사용, 페이징 기능이 활성화 된 경우 페이지당 출력 항목 수를 정수로 지정

    def get_context_data(**kwargs)

    뷰에서 템플릿 파일에 넘겨주는 context 데이터를 추가하거나 변경하는 목적으로 오버라이딩 한다.

    date_field

    month_format - '월'이 어떻게 출력되는지 정의한다.

     

    6. base.html 생성

    html 구조 뼈대와 css파일 및 각종 link들을 모아 템플릿 생성

    이 템플릿을 다른 html에 불러와 새로운 css를 줘서 꾸며준다.

     

    {% extends 'base.html' %}
    
    {% block title %}title{% endblock %}
    
    {% block content %}
    내용이 들어갈 자리
    {% endblock %}
    
    {% block footer %}
    <footer class="fixed-bottom bg-info">
    	<div style="text-align:center; padding:20px 0 "class="text-white font-italic mr-5">카피라이터 부분</div>
    </footer>
    {% endblock %}

    댓글

Designed by Tistory.