2013-03-25 3 views
3

html 및 csv download의 두 가지 방법으로보기의 내용을 표시하려고합니다. 내가 할 수 있었던 유일한 방법은 두 가지 다른보기를 사용하는 것이 었는데, 하나는 HTML 프리젠 테이션을위한 것이고 다른 하나는 CSV를위한 것이다. 이것은 내 코드를 복제하고보다 우아한 솔루션을 찾고 있습니다. 제안 사항이 있으십니까? 당신이 http://yourserver/myview?type=csv 같은 URL에 액세스하는 경우는 CSV 부분을 렌더링 URL에 매개 변수를 사용하고하나의보기에서 두 개의 템플릿 사용

def myview(request) : 

    type = request.GET.get('type', 'html') 

    # do processing 
    if type == 'html': 
     # return html 
    else if type == 'csv': 
     # return csv 

같은보기를 구현할 수

# views.py 

[...] 

def member_list(request): 
    member_list = Member.objects.all() 

    return render_to_response("member_list.html", 
          {'member_list':member_list) 


def member_csv_list(request): 
    member_list = Member.objects.all() 

    csv_list = HttpResponse(content_type='text/csv') 
    csv_list['Content-Disposition'] = 'attachment; filename="member_list.csv"' 
    writer = csv.writer(csv_list) 
    writer.writerow(['Name', 'Member Type', 'Rooms']) 
    for member in member_list: 
     fields = [member.name, member.member_type, member.room] 
     writer.writerow(fields) 

    return member_list 
+1

샘플 코드하시기 바랍니다 – catherine

답변

5

: 여기

샘플 코드입니다 보기의. URL http://yourserver/myview에 액세스하면보기의 HTML 부분을 반환합니다.

+0

불행히도 코드를 사용하여 다음과 같은 오류가 발생합니다 : 할당 전에 지역 변수 '형식'참조. 이 옵션에 urlconf 항목을 게시 할 수 있습니까? – jcuot

+0

@jcuot, 미안 해요,'request.GET.get()'의'type'은 따옴표로 묶어야합니다. 그것을 수정했습니다. – Rohan

+0

네, 예상대로 작동합니다. 감사! – jcuot

1

로한의 대답은 절대적으로 올바른 패러다임입니다. 이 주제에 대한 훌륭한 자습서 스타일의 소개는 cf. Multiple Templates in Django.

다음은 몇 가지 따옴표입니다 (모든 크레딧은 Scott Newman에게 제공됩니다).

기사의 인쇄 가능한 버전을 제공하려면 예를 들어 URL 끝에? printable을 추가 할 수 있습니다.

이 기능을 사용하려면보기에 추가 단계를 추가하여이 변수의 URL을 확인하십시오. 존재한다면 우리는 프린터 친숙한 템플릿 파일을로드 할 것입니다. 존재하지 않으면 일반 템플릿 파일을로드합니다. 템플릿 도메인 이름에 의해 및 다른 템플릿을 우선으로

def detail(request, pid): 
    ''' 
    Accepts a press release ID and returns the detail page 
    ''' 
    p = get_object_or_404(PressRelease, id=pid) 

    if request.GET.has_key('printable'): 
     template_file = 'press/detail_printable.html' 
    else: 
     template_file = 'press/detail.html' 

    t = loader.get_template(template_file) 
    c = Context({'press': p}) 
    return HttpResponse(t.render(c)) 

그는 계속됩니다. 이 모든 것이 훌륭합니다.

관련 문제