我是Django和Python的新手,如果这是一个noobie问题,请原谅我。我有一个应用程序,我有3个视图:
#views.py
from django.shortcuts import render_to_response
from django.shortcuts import render
from django.http import HttpResponse, HttpRequest, HttpResponseRedirect
from acme.acmetest.models import Player
from acme.acmetest.models import PickForm
def playerAdd(request, id=None):
form = PickForm(request.POST or None,
instance=id and Player.objects.get(id=id))
if request.method == 'POST' and form.is_valid():
form.save()
return HttpResponseRedirect('/draft/')
return render(request, 'makepick.html', {'form':form})
def draftShow(request):
draft_list = Player.objects.all()
context_instance=RequestContext(request)
return render_to_response('listpicks.html', {'draft_list' :draft_list})
def draftPage(request):
return render(request, 'pickpage.html')
当playerAdd和draftShow视图在浏览器中自行调用时,它们会正确呈现(映射到单独HTML文档上的单独URL)。 draftPage视图调用HTML页面:
pickpage.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML lang="en">
<head>
<title>PickPage</title>
</head>
<body>
{% include "makepick.html" %}
{% include "listpicks.html" %}
</body>
</HTML>
当我调用此页面时,我只会获得其他两个html页面的一部分。我得到表单上的按钮,但不是输入测试的字段,我得到listpicks的文本,但不是从数据库中提取的列表。这些只是html页面,正如我之前所说,当我自己调用它们时它们会起作用。
谢谢你的帮助。
DP
答案 0 :(得分:3)
你的问题是你的观点令人困惑。
当您使用include时,所有发生的事情都是在该点插入该模板的html。
与使用您所包含的模板的其他视图无关。因此,您必须在正在使用的视图中指定所包含模板的上下文。
所以在你的情况下,playerAdd和draftShow的上下文不可用,因为你还没有将它添加到draftPage中的render方法。
def draftPage(request):
form = PickForm()
draft_list = Player.objects.all()
context = {
'form':form,
'draft_list' :draft_list,
}
return render(request, 'pickpage.html', context)
在你看来会给你你想要的东西。只需确保表单提交到playerAdd视图即可正确处理。