web-dev-qa-db-ja.com

別のビュー内からビューを呼び出すことはできますか?

私のビューの1つは、他の機能とともにアイテムを追加する必要がありますが、すでにアイテムを追加する別のビューが既にあります。

次のようなことができますか:

def specific_add_item_view(request):
    item = Item.objects.create(foo=request.bar)

def big_view(request):
    # ...
    specific_add_item_view(request)
63
john2x

ビュー関数は、レンダリングされたHTMLをブラウザに(HttpResponseで)返す必要があります。ビュー内でビューを呼び出すということは、(潜在的に)2回レンダリングを実行していることを意味します。代わりに、ビューではない別の関数に「追加」を除外し、両方のビューでそれを呼び出すようにします。

def add_stuff(bar):
    item = Item.objects.create(foo=bar)
    return item

def specific_add_item_view(request):
    item = add_stuff(bar)
    ...

def big_view(request): 
    item = add_stuff(bar)
    ...
49
Seth

確かに、すべてのことを言って完了している限り、ビューはHttpResponseオブジェクトを返します。以下は完全に有効です。

def view1(request):
    # do some stuff here
    return HttpResponse("some html here")

def view2(request):
    return view1(request)

最初のビューからHttpResponseを返したくない場合は、無視する変数に保存するだけです:

def view1(request):
    # do some stuff here
    return HttpResponse("some html here")

def view2(request):
    response = view1(request)
    # do some stuff here
    return HttpResponse("some different html here")
61
brady

より良い方法は、テンプレートシステムを使用することです。 @Sethと@bradyのアイデアを組み合わせる:

def specific_add_item_view(request, extra_context_stuff=None):
    Item.objects.create()
    context_variables = {} # obviously want to populate this
    if extra_context_stuff:
        context_variables.update(extra_context_stuff)
    return render(request, 'app_name/view1_template.html', context_variables)

def bigger_view(request):
    extra_context_stuff = {'big_view': True}
    return specific_add_item_view(request, extra_context_stuff)

また、app_name/view1_template.htmlには条件付きテンプレートタグが含まれる場合があります

{% if big_view %}
<p>Extra html for the bigger view</p>
{% endif %}
8
hobs