-
파이썬 장고 블로그 앱 만들기기타/파이썬 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 %}
'기타 > 파이썬' 카테고리의 다른 글
파이썬 tkinter GUI 디비를 이용한 간단한 게임 (0) 2021.01.19 thkinter을 이용한 간단한 미니게임 (0) 2021.01.14 파이썬 장고의 정의 (0) 2021.01.12 파이썬 장고 정리내용 (0) 2021.01.08 파이썬 장고 - 북마크 만들기 (0) 2020.12.29