1)
여태까지 html 파일을 instagram 앱의 templates/instagram에 저장해왔다. template loader는 app directory loader, file system template loader로 구분할 수 있다. 특정 앱에 속하지 않은 html 파일은 프로젝트 settings.py의 DIRS에 저장하는 편이 좋다.
2)
post_detail = DetailView.as_view(
model = Post,
queryset = Post.objects.filter(is_public = True))
해당 코딩은 모든 사용자에 대해 is_public=True 조건의 포스팅을 보여주지만, 로그인하지 않은 사용자에게만 해당 조건을 걸어주고 싶은 경우 DetailView를 직접 상속받는 class를 만들어야한다.
class PostDetailView(DetailView):
model = Post
#queryset = Post.objects.filter(is_public = True)
def get_queryset(self):
qs = super().get_queryset()
if not self.request.user.is_authenciated:
qs = qs.filter(is_public = True)
return qs
이때도 queryset을 직접 정의해야 하는데 super()는 부모의 get_queryset()을 가져다 쓰겠음을 의미한다.
4)
context란 템플릿 내에서 참조될 값들을 사전의 형태로 준비해주는 것이다. 정의된 get_object()로 얻어진 object가 'object'라는 context로 저장된다
def post_detail(request: HttpRequest, pk: int) -> HttpResponse:
post = get_object_or_404(Post, pk=pk)
# try:
# post = Post.objects.get(pk=pk)
# except Post.DoesNotExist:
# raise Http404
return render(request, 'instagram/post_detail.html',{
'post': post,
# 'ojbect': post,
})
get_context_object_name()이 모델명을 반환하므로 post 모델은 'object'라는 이름과 'post'라는 이름으로 둘 다 접근 가능하다.