[Django] 장고 Views를 활용한 HTTP 요청 처리#4_장고 기본 CBV API

아직·2022년 7월 8일
0
post-thumbnail

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'라는 이름으로 둘 다 접근 가능하다.

0개의 댓글