是否有任何有效的方法将相同的上下文传递给多个视图?这就是我的意思:
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 :(得分: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'