谷歌应用引擎上的django render_to_response

时间:2013-08-27 16:33:38

标签: python django google-app-engine

我在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也不起作用。

0 个答案:

没有答案