Q&A
책을 따라하다가 막히는 부분이 있나요?
질문을 남겨주세요.
이 페이지는 의견 교환을 위해 따로 만든 페이지입니다. 책에서 이 페이지를 만드는 법을 직접적으로 다루지는 않습니다.
하지만, 책을 끝까지 읽고 나면 이 페이지도 만드실 수 있을거에요.
하지만, 책을 끝까지 읽고 나면 이 페이지도 만드실 수 있을거에요.
templates 에서 post, categories, post_list 이런 거는 views의 어디서 가져오는 건가요?
2 years, 10 months ago
xlqnxlfrom django.views.generic import ListView, DetailView
from .models import Post, Category
class PostList(ListView):
model = Post
# template_name = 'blog/post_list.html'
ordering = '-pk'
def get_context_data(self, **kwargs):
context = super(PostList, self).get_context_data()
context['categories'] = Category.objects.all()
context['no_category_post_count'] = Post.objects.filter(category=None).count()
return context
class PostDetail(DetailView):
model = Post
{% if post_list.exists %}
{% for category in categories %}
{{ post.title }}
views 파일과 연결된 거 같은데 어떤 규칙으로 templates에서 위와 같이 변수명으로 들어가는지 모르겠습니다
목록보기
edit11020211 2 years, 10 months ago
ListView 를 상속해서 만든 PostList 같은경우
해당 View 랑 연결되는 디폴트 템플릿(html) 은 모델명_list.html 이 됩니다.
위와같은경우에 model=Post 니까 디폴트 템플릿은 post_list.html 이 됩니다.
템플릿에서도 디폴트 템플릿( ex. post_list.html) 을 해줬듯이
CBV 방식으로 사이트를 빌드할시 html 템플릿에서 레코드객체를 디폴트 값( 장고가 정한 규칙 )
으로 찍어낼 수 있는데
ListView 같은경우에는 모델명_list 로 해당 {{ }} 중괄호 안쪽 또는 {% if ~~ %}에 집어넣어서 html에 찍어 내 줄 수 있습니다.
그러니까 캡쳐하신 부분에서 model = Post 라고 했기 때문에
{% if post_list.exists %} 이렇게 쓸 수 있는 것이지요..
post_list 라는 이름으로 표현하고 싶지 않다면
class PostList(ListView):
moel = Post
context_object_name = 'my_post_list'
이런식으로 context_object_name 의 속성값으로 원하시는 이름을 써주시면
post_list.html 에서는
{% if my_post_list %} 이렇게 바꿀 수 있습니다.
Updated: Dec. 12, 2021, 5:28 p.m.
edit11020211 2 years, 10 months ago
get_context_data 메소드의
context['categories'] = Category.objects.all()
에서
'categories'
가
{% for categor in categories %}
여기의 categories 에요
get_context_data가 딕셔너리형태의 자료를 담아서
해당 html 템플릿에서 '키' 의값을 출력시켜준다면
'값' 이 html 에 나타나게 되는 것이지요.
그러니까 캡쳐하신 html 에서
{% for categor in categories %}
에서
categories 는 결국
Category.objects.all() 값을 가져오게 되는 것이고
카테고리객체 전체의 쿼리셋을 for 문을 돌려서
카테고리 하나씩 뽑아내는 것이구요
Updated: Dec. 14, 2021, 10:47 p.m.
Leave a Comment: