2013-03-25 3 views
3

Я пытаюсь представить контент с точки зрения двумя способами: скачать html и csv. Единственный способ, которым я смог это сделать, - использовать 2 разных представления, один для презентации html и один для 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

Вы можете использовать параметр в свой адрес и реализовать вид, как

def myview(request) : 

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

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

Если вы получаете доступ к URL, как http://yourserver/myview?type=csv он будет оказывать Csv часть представления. Когда URL-адрес http://yourserver/myview будет доступен, он вернет html-часть представления.

+0

К сожалению, я получаю следующую ошибку, используя ваш код: локальная переменная 'type', на которую ссылаются перед назначением. Можете ли вы также опубликовать запись urlconf для этой опции? – jcuot

+0

@jcuot, извините, 'type' в' request.GET.get() 'должен быть в кавычках. Исправлено. – Rohan

+0

Да, этот работает, как и ожидалось. Благодаря! – jcuot

1

Ответ Рохана - это абсолютно правильная парадигма. За отличное введение в учебник в эту тему, ср. Multiple Templates in Django.

Вот несколько цитат (все кредиты принадлежат Скотту Ньюману).

Для обслуживания печатной версии статьи, например, мы можем добавить? Печатать до конца URL-адреса.

Чтобы сделать его работу, мы добавим дополнительный шаг на наш взгляд, чтобы проверить 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)) 

Он продолжает шаблон переопределяет и различные шаблоны от доменных имен. Все это отлично.

Смежные вопросы