WTForms не работают на Google App Engine 1.6.1 и Python 2.7 - PullRequest
3 голосов
/ 01 февраля 2012

Я новичок в 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 %}

Выглядит не так уж плохо.)

1 Ответ

2 голосов
/ 02 февраля 2012

Я думаю, вы должны передать AddForm.content в качестве значения шаблона (вместо AddForm)

template_values = {
        'form_self_link': self.request.path,
        'form_content': AddForm**.content**
}

UPDATE

нашел это в документации (http://wtforms.simplecodes.com/docs/0.6.1/ext.html#wtforms.ext.appengine.db.model_form)

wtforms.ext.appengine.db.model_form (model)

Создает и возвращает динамический wtforms.Form class для данного класса db.Model. Класс формы можно использовать как есть илислужить основой для расширенных классов форм ...

Так что вы передаете в шаблон класс, а не его экземпляр.

AddForm = model_form(Task)()
...