2012-01-23 3 views
0

올바른지/ajax POST 요청에 부분 템플릿을 반환하는 데 어떤 함정이 있습니까? 예를 들어Django 부분 템플릿 응답

:

if request.is_ajax: 
    # response is just the form 
    return render(request, 'contact/fields.html', {'form':form}) 
+0

부분적으로 말하자면 일부 HTML일까요? doctype 또는 태그가 없습니까? – dm03514

+0

맞습니다. something like

a bunch of html

답변

2

당신은 JSON 데이터에서 클라이언트 측을 필요로 어떤 HTML contructing. 그러나 이것이 행동과 표현을 혼합하는 것이고 HTML을 명확히 구분하는 것이 더 낫다고 주장 할 수 있습니다.

플립 사이드에서 HTML 블록을 반환하는 것은 "RESTful"의 극지방과 비슷합니다. 순수 REST 철학에서 뷰는 표준 및 재사용 가능한 컨테이너 (예 : JSON 또는 XML)의 데이터를 반환해야합니다. 나중에 iOS/Android/WP7/등으로 양식을 가져와야하는 경우 응용 프로그램 환경이 아닌 JSON/XML이 사용자에게도 도움이되는 반면 HTML은 사실상 쓸모가 없습니다.

두 인수를 쉽게 볼 수 있으며 필자는 필자가 다른 인수보다 필연적으로 적합하다고 생각하지 않습니다. 궁극적으로, 나는 당신이 당신의 앱에 가장 잘 맞는 것을하고, 당신에게 "옳은 것"을 느끼기 만하면된다고 생각합니다. 특정 상황에 대해보다 유지 보수 가능하고 확장 가능한 점을 생각해보십시오.

+0

+1 플립 측을 배치하기 위해 +1하지만 장고 1.4에서는 클라이언트 측 테스트를 작성하는 것이 일반적이되어야합니다. JSON 데이터를 일반적이고 RESTful 방식으로 반환하여 확실히 처리 할 수 ​​있습니다. –

0

내 아약스 반환 응답의 대부분을 생각은 DOM 요소가 아닌 전체 양식을 반환합니다.

(예)

... 
person = ''' <a href="/person/{0}" class="normalMenu">{1} {2}</a>'''.format(p.id, p.first_name, p.last_name) 
q = simplejson.dumps({"person":person}) 
return HttpResponse(q, mimetype="application/json") 

은 상기 템플릿에 간단한 DOM 요소를 다시 전송하고, 하단의 테이블에 삽입한다. 오른쪽에서 왼쪽으로 슬라이딩.

전체 템플릿을 보내면 전체 화면이 깜박이고 매끄러운 애니메이션이 나오지 않습니다. 어쨌든 그것이 내 이해입니다.

+0

내가하려고하는 것은 비록 json이 아닌 html로 반환하는 것입니다 ... –

0

몇 가지 jQuery 대화 상자에서이 작업을 수행했습니다. 대화 내용은 AJAX 요청에 의해 요청되며, 내용은 서버 측에서 렌더링 된 다음 반환되고 표시됩니다. 지금까지 나는 그것에 아무런 문제가 없었습니다.

0

개인적인 경험에서 나는 함정이 없다고 말할 수 있습니다. 나는 아주 좋은 디자인 패턴이 아니다. 나는 꽤 많이로드 된 프로젝트에서 그렇게하곤했다.

1

아직 양식 POST 요청으로 시도한 적은 없지만 전체 페이지를로드하지 않고 페이지 변경을 수행하는 부분 HTML을 AJAX GET 요청에 매우 비슷하게 반환합니다. 양식 요청에도 잘 작동 할 것이라고 생각합니다. 실제로 여러 개의 다른 양식이있는 페이지에서이 접근 방식을 사용할지 여부는 현재 논의 중입니다.

제대로 한 경우 나쁜 디자인 패턴이 아닌 것 같습니다. 우리는 AJAX 호출인지 여부에 따라 확장되는 기본 템플릿을 변경하여이 작업을 수행합니다.

단순화 된 예 : 가장 일반적인 방법은 다음 JSON을 반환하고

### view 
base_template = "base.html" 
if request.is_ajax(): 
    base_template = "base-ajax.html" 
return render_to_response(request, 'page.html', {'base_template': base_template}) 

### page.html 
{% extends base_template %} 
{% block main %}new page content{% endblock %} 

### base.html 
<html> 
<!-- complete html page --> 
...  
{% block main %}this is what changes per page{% endblock %} 
... 
</html> 

### base-ajax.html 
{% block main %}this is what changes per page{% endblock %}