[TIL] 오늘 공부 정리
오늘 한 것
[O] : 알고리즘 연습문제 : 9~10시
[O] : 팀프. 1~시 이후 진행
ㄴ 디버깅하기(이건 아직 진행 중..)
ㄴ 내가 쓴 comment를 볼 수 있는 기능 구현 + url 연결
ㄴ 새 기능 구현하기(트위터스타일의 페이지네이션)
[△] : Django 튜토리얼 7까지 진행.... >5까지 함
[O] : Python 책 읽기
오늘 정리 :
알고리즘 문제는 힌트코드를 분석하는 방향으로 공부했다.
10시반 - 1시는 집중이 안돼서 컴퓨터를 멀리하는 작업을 했다.
파이썬 책 읽기 및 구현하고 싶은 기능을 생각해보았다.
파이썬 lambda기능과 class를 다시 보았다
> lambda[인수, 적용할 내용] (무엇을 참조하는지) 정도로 이해했다.. 활용연습이 필요할 듯!
> __init__ 아직도 완전히 이해가 안된 요 아이를 책으로 읽어보며 이해도를 높여보려 애쓰는 중
팀프는 1시 이후 부터 진행했으며 늦은 점심을 먹고 페이지네이션과 테스트코드 작성에 대해 알아보았다. 페이지네이션은 이해했고, 테스트코드는 공부가 많이 필요하다ㅠ.
장고 공식문서의 튜토리얼을 진행했다.
어제 미룬 거만큼 더 해야했다...
오늘까지 보면 끝날줄 알았는데 중간중간 모르는 개념이나 주석을 찾아보며 꼼꼼하게 보다보니 시간이 걸리고 있다^^; 내일은 진짜 끝내야지
복습한 것
> DB에 넣은 글을 가져와서 화면을 출력하려면 모델을 불러와 모듈로 적용시키면 된다.
from .models import CommentModel
> 모델에서 자료를 꺼내는 방법은
- get 하나 가져오기
- filter (조건에 해당하는) 여러개 가져오기
- all 모두다 가져오기 (조건지정도 가능하다)
> Beautifull URL pattern을 제공하는 장고
이전은 정규표현식을 사용하여 URL을 표현하는 것이 대세였다면
장고에서는 일반적으로 사용자가 인식하기 쉬운 URL 패턴을 사용한다
- URL 패턴은 URL의 일반적인 형식 (예: /newsarchive/<year>/<month>/)
새롭게 알게 된 것
- re 모듈
- regex 문자열 패턴을 표현하는 일종의 형식 언어.
파이썬의 특수 기능 문자들을 메타 문자라고 한다
RegEx, RegExp라 쓴다.
** 메타문자와 같은 모양의 문자를 매칭하고자 할때는 백슬래쉬를 앞에 붙여 \(, \* 등으로 표현해야한다 **
메타문자 : $()*+.?[]\^{}|
- pagination 공부
1. 내 댓글 목록 가져와 출력하기
신 기능 구현 도전.
.all()[시작위치:끝날위치]
[0:10] 범위연산자를 사용해 지정한다
한 페이지에 가져오고 싶은 만큼의 db정보의 양을 조절할 수 있는데,
변수로 지정해서 넣으면 원하는 만큼의 글을 가져올 수 있다.
cmt_amount = 10
start_cmt = (page-1)* cmt_amount
end_cmt = start_cmt + cmt_amount
>>페이지네이션을 함께 지정한 경우로 페이지로 가져올 댓글의 순서를 계산하여 범위연산자에 적용한다.
+ 페이징 처리는 아래에 더 공부하여 추가함
시간순 정렬하기
* order_by('created') : created 순서대로 정렬
* order_by('-created') : created 역순으로 정렬
def index(request, page=1):
cmt_amount = 10
start_cmt = (page-1) * cmt_amount
end_cmt = start_cmt + cmt_amount
title = ‘내 댓글 목록'
my_comments = CommentModel.objects.filter(author=author)[start_cmt:end_cmt]
return (‘[%s] : 지금까지 댓글 [%d]개를 작성했습니다.’ % title, (int(entry_id)))
2. 댓글목록에 pagination 사용하기
방법 1 pagiantor 객체를 for문으로 전달해주기
from django.core.paginator import Paginator
Paginator(첫번째 인자, 두번째 인자)
첫번째 인자 : 가져올 db내용 변수
두번째 인자 : 한페이지에 몇개의 포스트를 볼지 정하기
def _페이지네이터 적용할 함수_(request):
comment_list = CommentModel.objects.all()
page = request.GET.get('page')
pagenator = Paginator(comment_list, 10)
page_obj = paginator.page(page)
return render(request, '/comment/my',
{'comment_list':comment_list, 'page_obj':page_obj})
comment_list 는 페이지 관계없이 전체 포스팅이 담겨있는 객체
page_obj 는 페이지마다 할당된 포스팅이 담긴객체이므로 담고자하는 template에 넣어준다.
{% for comment in page_obj %}
<li>{{ comment.title }}</li>
{% end for %}
[참조]:
여기까지 읽고 쓰면서 내가 원하는 기능이 아니구나 깨닫고 재공부에 들어갔다. 이것은 Digg스타일..
이후 내용이 필요하다면 참조를 보거나 페이지네이션에 대해 검색해보자.
방법 2. '더 보기' 기능 만들기
'더 보기'로 댓글을 최신순 10개씩 한 페이지에 불러오고 싶다
- Twitter 스타일의 페이지 만들기
내릴때, 더보기를 누를때 db에서 정보를 가져와주도록 만들고자했다.
이 부분을 views.py에 추가해준다
def my_comment_view(request, template='함수를 넣을 템플릿.html'):
author = settings.AUTH_USER_MODEL.name #nickname으로 해야겠지
context = {
'my_comments': CommentModel.objects.all(author=author),
}
return render_to_response(
template, context, context_instance=RequestContext(request))
<h2>Entries:</h2>
{% for my_cmt in my_comments %}
{% my_cmt %}
{% endfor %}
[참조]:
https://django-endless-pagination.readthedocs.io/en/latest/twitter_pagination.html
[참조]:
https://docs.djangoproject.com/ko/4.2/topics/pagination/
자꾸 어려운거 도전하니까 재미는 있는데
서버를 켜는 것 외에 구현이 되고있는지 시험하는 방법을 몰라서
답답하기도 하고... 궁금해 죽겠당.
- forms.py를 사용하면 Delete랑 Put이 안된다!
- <form> 사용과 HttpResponse, HttpResponse(reverse())
<form action="{% url 'polls:vote' question.id %}" method="post">
...
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
... # django 공식문서
템플릿의 <form>에는 action method를 설정할 수 있다
action = url 설정
method = get / post
request.POST : 키로 전송된 자료에 접근할 수 있게 해주는 사전같은 객체
request.POST['choice']
설문의 ID를 문자열로 반환한다
같은 방법인 request.GET으로 자료에 접근할 수 있지만
POST요청을 통해서만 자료가 수정되게 하기 위해 명시적으로 사용한다.
HttpResponseRedirect(reverse("polls:results", args=(question.id,)))
HttpResponseRedirect('리디렉션할 경로', optinal인수들)
POST 요청을 성공적으로 처리한 후에 반환
제어를 전달하기 원하는 뷰의 이름, URL패턴의 변수 부분을 넣어서 해당 뷰를 가리키도록 한다.
앞서 제출한 폼을 id 값에 맞추어 결과물(results)을 반환해준다!
"/polls/3/results/"
= HttpResponse의 서브클래스
클래스는 django.http 에 있다.
HttpResponse에도 단순히 문자열을 반환하는 것만이 아닌 정말 많은 기능들이 들어있으니 꼭 참조를 읽어보자
- 문자열 전달
- 반복자 전달
- 헤더 필드 설정(.headers)
- 응답을 파일첨부 처리 (.write)
- 속성들 (content / streaming 등)
자세한 내용은 아래에
[참조] HttpResponse:
https://docs.djangoproject.com/en/4.2/ref/request-response/#django.http.HttpResponse
reverse( viewname , urlconf = 없음 , args = 없음 , kwargs = 없음 , current_app = 없음 )
'polls'는 어떤 app의 url인지 알려주고, 'results'는 URLconf에 추가해준 이름 polls:results
[참조] Djagno.urls 유틸리티함수:
https://docs.djangoproject.com/en/4.2/ref/urlresolvers/
이전 학습내용을 바탕으로 내일 할 것
- 장고 튜토리얼 차근차근 진행하기
- 오늘 알고리즘 문제 다시 보기
- 팀프에도 집중하기
느낀점:
춘곤증인지 수족냉증인지 오전 중에 넘 졸리고 피곤하고 집중을 못했다
오늘 시간 많이 날림ㅠㅠ 그만큼 나머지공부로 채울 거지만..
30분만 일찍자고 일찍 일어나서 가벼운 운동으로 하루를 시작해야겠다
운동하고 식사 잘챙겨야 마음도 더 나는 법이니까용
아유 그냥 매일매일 발전하는구만 기특해