2017-07-11 14 views
1

複数のビューに同じコンテキストを渡す効率的な方法はありますか?これは私が意味するものです:同じコンテキスト変数を複数の関数ビューに渡す

def first(request) 
    form = SomeForm(request.POST or None) 
    return render(request, 'base.html', {'form': form}) 

def home(request) 
    form = SomeForm(request.POST or None) 
    return render(request, 'homepage.html', {'form': form}) 

def profile(request) 
    form = SomeForm(request.POST or None) 
    return render(request, 'profile.html', {'form': form}) 

私は同じコンテキストを複数のビューに渡しています。それは私がウェブサイト全体を通して必要とする統一変数であるため、基本的にすべてのビューに渡す必要があるコンテキストです。これをより効率的にする方法はありますか?

+0

あなたは基本的にeverypageで同じ形を望んでいますか?ログインフォームのように?フィードバック形式? –

答えて

0

私はこのタイプがあなたにこれをさせるかどうかわかりませんが、render()の結果を返す代わりに、それをリストに保存して使用できますか?

は、私は何を意味することは、このようなものです:変数の型を返してレンダリングする場合、これは動作するはず

def all(request): 
    form = SomeForm(request.POST or None) 
    my_list = ["base", "homepage", "profile"] ` 
    end_list = [] 
    for item in my_list: 
     end_list.append(render(request, item + '.html', {'form': form}) 
    return end_list 

。リストからレンダリングされた各ビューにアクセスできます。表示するビューがさらに多い場合は、my_listにタイプを追加するだけで済みます。このように収集できるものが返ってこない場合は、私の答えを削除します。

0

ベースビューを記述できます。

def base(request, template_name): 
    form = SomeForm(request.POST or None) 
    return render(request, template_name, {'form': form}) 

first = lambda request: base(request, template_name='base.html') 
home = lambda request: base(request, template_name='homepage.html') 
profile = lambda request: base(request, template_name='profile.html') 

しかしあなたは私はあなたにDjango CBVを示唆し、よりよい解決策を探している場合。これははるかにきれいに見え、DRYをサポートします。

from django.shortcuts import render 
from django.views import View 

from .forms import SomeForm 

class BaseView(View): 
    form_class = SomeForm 
    template_name = None 

    def get(self, request, *args, **kwargs): 
     form = self.form_class() 
     return render(request, self.template_name, {'form': form}) 

    def post(self, request, *args, **kwargs): 
     form = self.form_class(request.POST) 
     return render(request, self.template_name, {'form': form}) 


class FirstView(BaseView): 
    template_name = 'base.html' 

class HomeView(BaseView): 
    template_name = 'home.html' 

class ProfileView(BaseView): 
    template_name = 'profile.html' 
関連する問題