0

我在 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 是行不通的。

4

0 回答 0