将相同的上下文变量传递给多个函数视图

时间:2017-07-11 22:10:45

标签: python django django-views

是否有任何有效的方法将相同的上下文传递给多个视图?这就是我的意思:

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})

正如您所看到的,我将相同的上下文传递给多个视图。这是我必须传递到基本上每个视图的上下文,因为它是我在整个网站中需要的统一变量。有没有办法让这个更有效率?

2 个答案:

答案 0 :(得分: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

如果render返回一个变量类型,那么这应该有效。您可以访问从列表中呈现的每个视图,如果要渲染更多视图,则可以向my_list添加更多类型。如果它没有返回可以像这样收集的东西,那么我将删除我的答案。

答案 1 :(得分: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'