Я новичок в GAE и все такое, что связано с Python, поэтому вопрос, наконец, может быть глупым.)
У меня есть модель:
from google.appengine.ext import db
class Task(db.Model):
name = db.StringProperty()
summary = db.StringProperty(multiline=True)
, и я хочу автоматически сгенерировать форму, так:
import webapp2
import jinja2
import os
from wtforms.ext.appengine.db import model_form
from Tasks.model import Task
jinja_environment = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__) + '/../templates/admin'))
class AddTaskPage(webapp2.RequestHandler):
def get(self):
AddForm = model_form(Task)
template_values = {
'form_self_link': self.request.path,
'form_content': AddForm
}
template = jinja_environment.get_template('add_task.html')
self.response.out.write(template.render(template_values))
add_task.html template:
<form method="POST" action="{{form_self_link}}">
{{form_content}}
<input type="submit" value="Add">
</form>
И наиболее запутанным является вывод -
<form method="POST" action="/admin/tasks/add">
<class 'wtforms.ext.appengine.db.TaskForm'>
<input type="submit" value="Добавить">
</form>
Нет элементов формы, естьпросто очень странные вещи <class 'wtforms.ext.appengine.db.TaskForm'>
.
Я использую GAE 1.6.1, python 2.7.2, jinja 2.6 (в комплекте с GAE), WTForms 0.6.3 (последняя версия)
Не могли бы вы, пожалуйстаhelp?
ОБНОВЛЕНИЕ: я использовал инструкцию, связанную с классом, и она не работает:
from google.appengine.ext import db
from tipfy.ext.model.form import model_form
# Define an example model and add a record.
class Contact(db.Model):
name = db.StringProperty(required=True)
city = db.StringProperty()
age = db.IntegerProperty(required=True)
is_admin = db.BooleanProperty(default=False)
new_entity = Contact(key_name='test', name='Test Name', age=17)
new_entity.put()
# Generate a form based on the model.
ContactForm = model_form(Contact)
# Get a form populated with entity data.
entity = Contact.get_by_key_name('test')
form = ContactForm(obj=entity)
Единственный странный момент - "из tipfy.ext.model.form import model_form"строка, но я думаю, что это просто ошибка в документах.
ОБНОВЛЕНИЕ 2
Ну, мне удалось заставить его работать, и, может быть, я что-то пропустил, кажется, что нет функции "автоматическая печатьФорма "в WTForm.Так что теперь это работает так:
class AddTaskPage(webapp2.RequestHandler):
def get(self):
AddForm = model_form(Task)()
template_values = {
'form_self_link': self.request.path,
'form_name_field': AddForm.name
}
template = jinja_environment.get_template('add_task.html')
self.response.out.write(template.render(template_values))
И распечатывает
<form method="POST" action="/admin/tasks/add">
<input id="name" name="name" type="text" value="">
<input type="submit" value="Добавить">
</form>
Ну ... кажется, что единственный вариант - сделать что-то подобное в будущем (взято из документации)
<form method="POST" action="/...">
<div>{{ form.username.label }}: {{ form.username(class="css_class") }}</div>
<div>{{ form.password.label }}: {{ form.password() }}</div>
<!-- and so on .... -->
</form>
Неужели нет никаких библиотек форм для автоматической генерации и автоматической печати для GAE с Python 2.7? (
LAST UPDATE
Хорошо... Я нашел один вариант, чтобы заставить его работать и визуализировать все элементы формы:
class AddTaskPage(webapp2.RequestHandler):
def get(self):
addForm = model_form(Task)()
template_values = {
'form_self_link': self.request.path,
'form': addForm
}
template = jinja_environment.get_template('add_task.html')
self.response.out.write(template.render(template_values))
def post(self):
addForm = model_form(Task)(self.request.POST)
template_values = {
'form_self_link': self.request.path,
'form': addForm
}
template = jinja_environment.get_template('add_task.html')
self.response.out.write(template.render(template_values))
В шаблоне:
{% for field in form %}
<tr>
<th>{{ field.label }}</th>
<td>{{ field }}</td>
</tr>
{% endfor %}
Выглядит не так уж плохо.)