我在Google App Engine上使用Django遇到了一个奇怪的问题。我在django-app中定义了一个文件上传表单,如下所示:
class ConvertForm(forms.Form):
from = forms.ChoiceField(choices=choices_from,
label='from:')
to = forms.ChoiceField(choices=choices_to,
label='to:')
class Meta:
fields = ('from','to')
然后我在app.views文件中有以下内容:
def convert(request):
if request.POST:
form = ConvertForm(request.POST,request.FILES)
if form.is_valid():
from = form.cleaned_data['from']
to = form.cleaned_data['to']
# Redirect to a result page after post to avoid duplicates
return HttpResponseRedirect('/convert/results')
else:
form = ConvertForm()
args = {}
args.update(csrf(request))
args['form']=form
return render_to_response('convert.html',args)
我的convert.html模板的表单部分如下所示:
<form action="/convert/convert/" method="post" enctype="multipart/form-data">{%\
csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input type="submit" name="submit" value="Convert">
</form>
它应该是一个文件上传表单(因此是多部分),但我为了简洁而编辑了表单内容。
现在,当我浏览正确的网址时,没有任何反应。我可以清楚地看到正在调用正确的函数,因为用简单的
替换convert()函数的主体return render_to_response('convert_test.html',{'some_text':some_text})
在浏览器窗口中显示some_text的值。在GAE中处理我缺少的表单时,还有其他的怪癖,或者为什么convert.html不是用表单呈现的?我应该提到所有这些都在localhost上,我还没有部署它。
编辑:经过一番调整之后,似乎错误的来源可能是模板的继承。如果我取出convert.html中的所有django-tags {},我可以让表单正确呈现。 那么,现在的问题是如何在GAE中正确设置模板继承?
我的完整convert.html模板如下所示:
{% extends "base.html" %}
{% block content %}
<h2>[ convert ]</h2>
<form action="/convert/convert/" method="post" enctype="multipart/form-data">{% \
csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input type="submit" name="submit" value="Convert">
</form>
{% endblock %}
所以基本上重新定义了base.html模板的内容块。在我在GAE上测试之前,这是完美的工作,所以我不能动摇那种涉及某种程度的感觉。
如果相关,我的django settings.py对于模板看起来像这样:
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__),'..','convert','templates'),
os.path.join(os.path.dirname(__file__),'..','templates'),
)
正如我所说的那样,从convert.html中取出{} -tags会给我一个表单,但是在一个完全白色和空白的页面中自行呈现。
这是我的base.html模板的内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/\
DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="description" content="Your description goes here" />
<meta name="keywords" content="your,keywords,goes,here" />
<meta name="author" content="Your Name" />
<link rel="stylesheet" type="text/css" href="/static/css/basic-minimal.css" ti\
tle="Basic Minimal" media="all" />
<title>Basic Minimal v1.2</title>
</head>
<body class="light">
<div id="wrap">
<div id="header">
<h1><a href="/convert/main">[ snazzy title ]</a></h1>
</div>
<div id="sidebar">
<ul>
<li><a href="/convert/convert">[ Convert ]</a></li>
<li><a href="/convert/transform">[ Transform ]</a></li>
<li><a href="/convert/help">[ Help ]</a></li>
<li><a href="/convert/references">[ References ]</a></li>
</ul>
</div>
<div id="content">
<h2>[ more title ]</h2>
<p>Text</p>
<p>More text</p>
</div>
</div>
</body>
</html>
这对于“标题”页面非常有效(即使css被加载),但是使用它作为基础将其他模板渲染为上面的convert.html也不起作用。