2017-07-11 27 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'