jcuot
jcuot

Reputation: 951

using two templates from one view

I am trying to present content from a view in two ways: html and csv download. The only way I was able to do it was to use 2 different views, one for html presentation and one for csv. This duplicates my code and I am looking for a more elegant solution. Any suggestions?

Here is the sample code:

# 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

Upvotes: 3

Views: 4832

Answers (2)

Rohan
Rohan

Reputation: 53326

You can use a parameter in your url and implement a view like

def myview(request) :

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

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

If you access a url like http://yourserver/myview?type=csv it will render the csv part of the view. When the url http://yourserver/myview is accessed it will return the html part of the view.

Upvotes: 5

Private
Private

Reputation: 2694

Rohan's answer is absolutely the right paradigm. For an excellent tutorial-style introduction to this topic, cf. Multiple Templates in Django.

Here are a few quotes (all credit goes to Scott Newman).

To serve a printable version of an article, for example, we can add ?printable to the end of the URL.

To make it work, we'll add an extra step in our view to check the URL for this variable. If it exists, we'll load up a printer-friendly template file. If it doesn't exist, we'll load the normal template file.

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))

He continues with template overrides and different templates by domain names. All this is excellent.

Upvotes: 1

Related Questions