2012-05-07 2 views
1

ImageFieldPhoto 모델이 있다고 가정 해 보겠습니다.django 템플릿에서 DB에 액세스 할 수 있습니까?

템플릿의 모든 사진 개체를 {% for photo in Photo.objects.all %} 번으로 반복하려고했습니다.
아무 것도 나오지 않습니다.

이것이 불가능합니까?

+0

보기 코드를 표시하십시오. Preet이 말했듯이 템플릿은 모델에 직접 액세스 할 수 없습니다. 컨텍스트에있는 내용과 미들웨어에 추가 된 것만 얻을 수 있습니다. –

답변

5

일반적인 방법은 다음과 같습니다. 보이는 같은 : 다음

def photo_view(request): 
    return render_to_response('app_name/photos.html', { 
     'photos': Photo.objects.all() 
     }) 

그리고 (이 예에서는 app_name/templates/app_name/photos.html에서) 템플릿은 같은 것을 가지고

{% for photo in photos %} 

당신이 만약 정말로

def photo_view(request): 
    return render_to_response('app_name/photos.html', { 
     'Photo': Photo 
     }) 

곰 염두에 템플릿 구문은 더 많은 제한 파이썬보다로서이, 정말 할 수있는 방법의 더 나은 아니라고 : 다음보기 코드는 컨텍스트를 통해 Photo를 통과해야 {% for photo in Photo.objects.all %}을 수행 할 . 예를 들어 템플릿에 {% for photo in Photo.objects.filter(...) %}을 수행 할 방법이 없습니다. 필터링은보기에서 수행되어야합니다.

3

잘못된 방식으로 생각할 수도 있습니다.

HTTP 요청이보기로 라우팅됩니다.

뷰는 비즈니스 로직 (ORM을 통해 DB에 액세스하는 것을 포함 할 수 있음)을 수행 한 다음 필요한 모든 데이터/객체를 템플릿 사전 시스템으로 컨텍스트 사전으로 전달합니다.

템플릿 시스템은보기에서 전달 된 내용 만 볼 수 있습니다. 객체가 지연 평가 된 ORM DB 반복자라면, 확실히 DB에 액세스 할 수 있습니다. 그러나 뷰는 해당 객체를 템플릿의 컨텍스트로 전달해야합니다.

템플릿에 {{Photo}}을 시도하여 실제로 해당보기에서 "Photo"이라는 개체가 전달되고 있는지 확인하십시오. 생성 된 html의 출처를 조사해야 할 수도 있습니다 (repr 때문에 꺽쇠 괄호로 이상하게 보이고 브라우저에 올바르게 표시되지 않습니다.)

관련 문제