我在 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>
它应该是一个文件上传表单(因此是多部分),但为了简洁起见,我编辑了表单内容。
现在,当我浏览正确的 url 时,什么也没有发生。我可以清楚地看到正在调用正确的函数,因为将 convert() 函数的主体替换为一个简单的
return render_to_response('convert_test.html',{'some_text':some_text})
在浏览器窗口中显示 some_text 的值。在处理我丢失的 GAE 中的表单时是否有任何额外的怪癖,或者为什么没有使用表单呈现 convert.html?我应该提到所有这些都在本地主机上,我还没有部署它。
编辑:经过更多的摆弄之后,似乎错误的根源在于模板的继承。如果我取出 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 是行不通的。