달리 지정하지 않으면 일반 html 응답을 반환하는보기를 만들려고합니다. django의 rest_framework를 사용하여 요청 된 경우 JSON을 반환합니다.
템플릿 내부의 컨텍스트에 액세스하려는 부분을 제외하고 모두 잘 작동합니다.
다음은 그림을 기반으로 한 작은 코드 예제입니다.
@api_view(('GET', ))
@renderer_classes((TemplateHTMLRenderer, UnicodeJSONRenderer, JSONRenderer, BrowsableAPIRenderer))
def index(request):
queryset = Picture.objects.all()
page = request.GET.get('page')
paginator = Paginator(queryset, 25)
try:
pictures = paginator.page(page)
except PageNotAnInteger:
pictures = paginator.page(1)
except EmptyPage:
pictures = paginator.page(paginator.num_pages)
serializer_context = {'request': request, 'pictures': pictures, 'filter': FilterForm()}
serializer = PaginatedPictureSerializer(pictures, context=serializer_context)
return Response(serializer.data, template_name='index.html')
템플릿 내 컨텍스트에 액세스하려는 경우 새로운 기능 :
{% if pictures %}
{% for picture in pictures %}
...
{% endfor %}
{% else %}
<p>No pictures are available.</p>
{% endif %}
결과는 항상 다음과 같습니다. 사용할 수있는 그림이 없습니다 (그리고 디버깅도 마찬가지입니다).
편집 : 요청대로
class PictureSerializer(serializers.ModelSerializer):
class Meta:
model = Picture
class PaginatedPictureSerializer(pagination.PaginationSerializer):
class Meta:
object_serializer_class = PictureSerializer
여러 컨텍스트 항목을 렌더링 할 때의 문제점은 템플릿 내부의 키에 액세스 할 수 없다는 것입니다. 조금만 해킹해야합니다.
이 문제를 해결 하는 관련 SO 질문 이 있습니다. 따라서 기본적으로 다음을 수행합니다.
serializer_context = {'request': request, 'pictures': pictures, 'filter': FilterForm()}
if request.accepted_renderer.format == 'html':
return Response(serializer_context, template_name='index.html')
serializer = PaginatedPictureSerializer(pictures, context=serializer_context)
return Response(serializer.data, template_name='index.html')
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다