source

Ajax 호출 후 Django 템플릿을 사용한JSON 오브젝트 렌더링

manycodes 2023. 2. 25. 21:26
반응형

Ajax 호출 후 Django 템플릿을 사용한JSON 오브젝트 렌더링

장고에서 아약스를 하는 최적의 방법이 뭔지 알아보는 중이야.여러 가지 내용을 읽으면서 공통적인 과정은 다음과 같다는 것을 알 수 있습니다.

  1. JavaScript 라이브러리(를 들어 jQuery)를 사용하여 Ajax 콜을 공식화하고 콜을 포착하여 뷰 함수에 전달하는 URL 패턴을 Django에 설정합니다.

  2. Python view 함수에서 관심 있는 개체를 검색하여 JSON 형식 또는 유사한 형식으로 클라이언트에 반환합니다(내장 시리얼라이저 모듈 또는 simplejson 사용).

  3. JSON 데이터를 수신하고 이를 해석하는 콜백 함수를 JavaScript에 정의하여 표시에 필요한 HTML을 만듭니다.마지막으로 JavaScript 스크립트는 HTML을 어디에 두든 저장합니다.

장고 템플릿이 이 모든 것과 어떻게 관련되어 있는지 아직도 이해가 안 가는군요.템플릿의 힘을 전혀 활용하지 않는 것 같습니다.이상적으로는 JSON 오브젝트와 템플릿 이름을 되돌려 데이터를 반복하고 HTML 블록을 만드는 것이 좋다고 생각했습니다.하지만 내가 완전히 틀렸는지도 몰라

이 방향으로 이동하는 유일한 리소스는 이 스니펫(769)뿐이지만 아직 시도하지 않았습니다.이 경우 생성되는 모든 HTML이 서버 측에서 생성되어 클라이언트에 전달됩니다.JavaScript-callback 함수는 올바른 위치에 표시만 하면 됩니다.

이로 인해 퍼포먼스 문제가 발생합니까?그렇지 않다면 위의 스니펫을 사용하지 않더라도 프런트엔드가 아닌 Python을 사용하여 HTML을 백엔드로 직접 포맷하는 것은 어떨까요?

감사합니다!

업데이트: 스니펫 942는 위의 확장 버전이기 때문에 사용하세요!상속 지원이 훨씬 더 효과적이라는 것을 알게 되었습니다.

안녕 바이킹고세군도 고마워!

저도 데코레이터를 사용하는 것을 좋아합니다. :-)하지만 그 동안 나는 위에서 언급한 단편에서 제안하는 접근법을 따라왔다.단, 원본보다 개선된 버전이기 때문에 대신 942번 스니펫을 사용하십시오.동작 방법은 다음과 같습니다.

템플릿(예: '서브템플릿)이 있다고 가정합니다.html')를 사용하여 재사용할 수 있는 유용한 블록을 포함합니다.

     ........
    <div id="results">          
        {% block results %}
            {% for el in items %}
                   <li>{{el|capfirst}}</li>
            {% endfor %}
        {% endblock %}      
    </div><br />
     ........

뷰 파일에 위의 스니펫을 Import하면 템플릿 내의 모든 블록을 쉽게 참조할 수 있습니다.템플릿 간의 상속 관계가 고려되므로 다른 블록 등이 포함된 블록을 참조하면 모든 것이 정상적으로 작동합니다.ajax 뷰는 다음과 같습니다.

from django.template import loader
# downloaded from djangosnippets.com[942]
from my_project.snippets.template import render_block_to_string

def ajax_view(request):
    # some random context
    context = Context({'items': range(100)})
    # passing the template_name + block_name + context
    return_str = render_block_to_string('standard/subtemplate.html', 'results', context)
    return HttpResponse(return_str)

다음은 기존 렌더링과 Ajax-response 렌더링에 동일한 템플릿을 사용하는 방법입니다.

템플릿:

<div  id="sortable">

{% include "admin/app/model/subtemplate.html" %}
</div>

포함된 템플릿(서브템플릿이라고도 함):

<div id="results_listing">
{% if results %}
    {% for c in results %}
        .....
    {% endfor %}
{% else %}

Ajax 뷰:

@login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
    .....

    return { 
        "results":Model.objects.all(),
    }      

물론 render_to_response를 사용할 수 있습니다.하지만 난 그런 짜증나는 장식가들이 좋아.d

Ajax를 사용하여 렌더링된 HTML 비트를 반환하고 원하는 지점에서 기존 페이지에 삽입할 수 없습니다.물론 이 HTML을 렌더링하기 위해 Django의 템플릿을 사용할 수 있습니다.

Ajax를 할 때는 템플릿을 사용할 필요가 없다고 생각합니다.템플릿은 서버 측에서 쉽게 동적 HTML을 생성할 수 있도록 하기 위해 HTML 내부에 프로그래밍 후크를 거의 제공하지 않습니다.

Ajax의 경우 JSON 데이터를 전달하고 Python에서 원하는 포맷을 할 수 있습니다.HTML/Document 요소는 클라이언트 측에서 jQuery와 같은 JavaScript 라이브러리에 의해 JSON을 사용하여 클라이언트 측에서 생성됩니다.

서버 측 HTML에서 내부 HTML을 교체하는 매우 구체적인 사례가 있다면 템플릿을 사용할 수 있을 것입니다만, 이 경우 JSON이 필요한 이유는 무엇입니까?Ajax를 통해 HTML 페이지를 조회하고 내부 또는 외부 HTML을 변경할 수 있습니다.

템플릿은 프레젠테이션용입니다.X 형식의 데이터(JSON, JSONP, XML, YAML, *ml 등)로 응답하는 것은 프레젠테이션이 아니기 때문에 템플릿은 필요 없습니다.데이터를 X 형식으로 직렬화하고 HttpResponse로 반환하기만 하면 됩니다.

템플릿은 프레젠테이션용일 뿐이지만 서버 측이든 클라이언트 측이든 상관없습니다.이 모든 것은 마크업 작성만을 담당하는 뷰 로직과 액션을 실행하는 컨트롤 로직을 분리하는 것으로 귀결됩니다.만약 당신의 Javascript 제어 로직이 HTML을 렌더링 또는 표시하는 방법을 다루어야 한다면, 당신은 잘못하고 있을 수 있습니다.그러나 만약 당신이 그 렌더링 로직을 다른 오브젝트나 함수로 분리하여 렌더링에 필요한 데이터를 전달한다면, 당신은 괜찮을 것입니다.그것은 우리가 어떻게 컨트롤러, 모델, 뷰를 t에서 분리하는지를 반영합니다.서버측.

github 프로젝트를 보시기 바랍니다.http://github.com/comolongo/Yz-Javascript-Django-Template-Compiler

django 템플릿을 최적화된 javascript 함수로 컴파일하여 프레젠테이션 html을 생성하고 전달한 데이터를 생성합니다.컴파일된 함수는 순수 javascript이므로 다른 라이브러리에 의존하지 않습니다.템플릿은 런타임에 해석되는 것이 아니라 컴파일되기 때문에 문자열과 변수는 모두 연결하기만 하면 되는 Javascript 문자열에 이미 배치되어 있기 때문에 최종 프레젠테이션을 얻기 위해 돔 조작이나 스크립트 파싱을 수행해야 하는 기술에 비해 속도가 크게 향상됩니다.현재는 기본적인 태그와 필터만 존재하지만 대부분의 경우 충분합니다.또한 사람들이 태그에 대한 요청을 하거나 프로젝트에 참여하기 시작하면 태그가 더 추가됩니다.

하시면 됩니다.jquery.load()또는 비슷한 방법으로 서버에서 HTML을 생성하여 JavaScript를 사용하여 DOM에 로드합니다.누군가 이걸 AJAH라고 부른 것 같아.

유감스럽게도 Django 템플릿은 서버측에서만 실행되도록 설계되어 있습니다.Javascript를 사용하여 Django 템플릿을 렌더링하는 프로젝트가 적어도 1개 있지만, 사용해 본 적이 없기 때문에 얼마나 빠른지, 잘 지원되고 있는지, 최신인지 알 수 없습니다.그 외에 서버에서 Django 템플릿을 사용하거나 템플릿을 사용하지 않고 클라이언트에서 동적 요소를 생성해야 합니다.

언급URL : https://stackoverflow.com/questions/882215/rendering-json-objects-using-a-django-template-after-an-ajax-call

반응형