3

ビューからコンテンツを表示しようとしています。htmlとcsvのダウンロードです。私がそれを行うことができた唯一の方法は、2つの異なるビューを使用することでした。1つはhtmlプレゼンテーション用で、もう1つは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
4

2 に答える 2

5

URLでパラメータを使用して、次のようなビューを実装できます。

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部分がレンダリングされます。URLhttp://yourserver/myviewにアクセスすると、ビューのhtml部分が返されます。

于 2013-03-25T11:37:50.083 に答える
1

ローハンの答えは絶対に正しいパラダイムです。このトピックの優れたチュートリアルスタイルの紹介については、を参照してください。Djangoの複数のテンプレート

ここにいくつかの引用があります(すべてのクレジットはスコットニューマンに行きます)。

たとえば、記事の印刷可能なバージョンを提供するために、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))

彼は、テンプレートのオーバーライドドメイン名によるさまざまなテンプレートを続行します。これはすべて素晴らしいです。

于 2013-08-16T08:15:05.817 に答える