Google App Engine + 表单验证
我想在谷歌应用引擎上进行表单验证,但我不知道该怎么做。
我试过这样:
from google.appengine.ext.db import djangoforms
from django import newforms as forms
class SurveyForm(forms.Form):
occupations_choices = (
('1', ""),
('2', "Undergraduate student"),
('3', "Postgraduate student (MSc)"),
('4', "Postgraduate student (PhD)"),
('5', "Lab assistant"),
('6', "Technician"),
('7', "Lecturer"),
('8', "Other" )
)
howreach_choices = (
('1', ""),
('2', "Typed the URL directly"),
('3', "Site is bookmarked"),
('4', "A search engine"),
('5', "A link from another site"),
('6', "From a book"),
('7', "Other")
)
boxes_choices = (
("des", "Website Design"),
("svr", "Web Server Administration"),
("com", "Electronic Commerce"),
("mkt", "Web Marketing/Advertising"),
("edu", "Web-Related Education")
)
name = forms.CharField(label='Name', max_length=100, required=True)
email = forms.EmailField(label='Your Email Address:')
occupations = forms.ChoiceField(choices=occupations_choices, label='What is your occupation?')
howreach = forms.ChoiceField(choices=howreach_choices, label='How did you reach this site?')
# radio buttons 1-5
rating = forms.ChoiceField(choices=range(1,6), label='What is your occupation?', widget=forms.RadioSelect)
boxes = forms.ChoiceField(choices=boxes_choices, label='Are you involved in any of the following? (check all that apply):', widget=forms.CheckboxInput)
comment = forms.CharField(widget=forms.Textarea, required=False)
我想把它显示成这样:
template_values = {
'url' : url,
'url_linktext' : url_linktext,
'userName' : userName,
'item1' : SurveyForm()
}
但是我收到了这个错误信息:
追踪信息(最近的调用在最前面):
文件 "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp_init_.py",第 515 行,在 call 中
handler.get(*groups)
文件 "C:\Program Files\Google\google_appengine\demos\b00213576\main.py",第 144 行,在 get 中
self.response.out.write(template.render(path, template_values))
文件 "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\template.py",第 143 行,在 render 中
return t.render(Context(template_dict))
文件 "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\template.py",第 183 行,在 wrap_render 中
return orig_render(context)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 168 行,在 render 中
return self.nodelist.render(context)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 705 行,在 render 中
bits.append(self.render_node(node, context))
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 718 行,在 render_node 中
return(node.render(context))
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template\defaulttags.py",第 209 行,在 render 中
return self.nodelist_true.render(context)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 705 行,在 render 中
bits.append(self.render_node(node, context))
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 718 行,在 render_node 中
return(node.render(context))
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 768 行,在 render 中
return self.encode_output(output)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\template_init_.py",第 757 行,在 encode_output 中
return str(output)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\util.py",第 26 行,在 str 中
return self.unicode().encode(settings.DEFAULT_CHARSET)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\forms.py",第 73 行,在 unicode 中
return self.as_table()
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\forms.py",第 144 行,在 as_table 中
return self._html_output(u'%(label)s%(errors)s%(field)s%(help_text)s', u'%s', '', u'
%s', False)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\forms.py",第 129 行,在 _html_output 中
output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': unicode(bf), 'help_text': help_text})
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\forms.py",第 232 行,在 unicode 中
value = value.str()
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\util.py",第 26 行,在 str 中
return self.unicode().encode(settings.DEFAULT_CHARSET)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\widgets.py",第 246 行,在 unicode 中
return u'\n%s\n
' % u'\n'.join([u'%s ' % w for w in self])
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\widgets.py",第 238 行,在 iter 中
yield RadioInput(self.name, self.value, self.attrs.copy(), choice, i)
文件 "C:\Program Files\Google\google_appengine\lib\django\django\newforms\widgets.py",第 212 行,在 init 中
self.choice_value = smart_unicode(choice[0])
类型错误:'int' 对象不可下标访问
你有没有想法,我该如何在不同的情况下进行这个验证?
我试过用这种方式:
class ItemUserAnswer(djangoforms.ModelForm):
class Meta:
model = UserAnswer
但我不知道怎么给这个表单添加额外的标签,而且它显示在一行上。你有什么建议吗?
非常感谢,这让我很烦恼,为什么它还是不工作:/
2 个回答
这里有个问题
rating = forms.ChoiceField(choices=range(1,6), label='你的职业是什么?', widget=forms.RadioSelect)
这里的choices被设置为一个整数值。
内置的方法 is_valid()
是用来验证的。当我提交一个表单时,我是通过 HTTP POST 的方式来进行的。
def post(self):
try:
upload_files = self.get_uploads('file') # 'file' is file upload field in the form
if upload_files:
blob_info = upload_files[0]
except:
self.response.out.write('File not uploaded')
try:
data = AForm(data=self.request.POST)
if data and data.is_valid():
# Save the data, and redirect to the view page
entity = data.save(commit=False)
entity.added_by = users.get_current_user()
entity.put()
if upload_files:
im = Image(reference=entity)
im.primary_image = blob_info.key()
im.put()
entity.put()
self.redirect('/serve/%s' % blob_info.key())
else:
# Reprint the form
self.response.out.write('<html><body>'
'<form method="POST" '
'action="/">'
'<table>')
self.response.out.write(data)
self.response.out.write('</table>'
'<input type="submit">'
'</form></body></html>')
except:
self.redirect('/serve/%s' % blob_info.key())