Google App Engine示例已修改

时间:2010-09-07 06:53:10

标签: python google-app-engine

我采用了Google App Engine的官方示例,该示例创建了一个购物清单,并对其进行了修改,以便:

创建两个表(联系人和Phonenumber)而不是一个Shoppinglist。 这是为了理解谷歌如何处理两个表和外键(见下面的代码)。

直到第47行显示所有内容:

data = PhoneNumber(data = self.request.POST) data2 =联系人(data2 = self.request.POST)

不知何故,它无法处理第二个“data2”对象并给出了错误信息:

TypeError: init ()得到了一个意外的关键字参数'data2'

为什么呢? 我能做些什么才能让它发挥作用?

感谢您的时间。

import cgi

from google.appengine.api import users
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app

from google.appengine.ext.db import djangoforms

class Contact(db.Model):
    name = db.StringProperty()
    birth_day = db.DateProperty()
    address = db.PostalAddressProperty()

class PhoneNumber(db.Model):
    contact = db.ReferenceProperty(Contact,
                                   collection_name='phone_numbers')
    phone_type = db.StringProperty(
        choices=('home', 'work', 'fax', 'mobile', 'other'))
    number = db.PhoneNumberProperty()

class PhoneNumberForm(djangoforms.ModelForm):
    class Meta:
        model = PhoneNumber

class ContactForm(djangoforms.ModelForm):
    class Meta:
        model = Contact

class MainPage(webapp.RequestHandler):
    def get(self):
        self.response.out.write('<html><body>'
                                '<form method="POST" '
                                'action="/">'
                                '<table>')
        # This generates our PhoneNumber, Contact list form and writes it in the response
        self.response.out.write(PhoneNumberForm())
        self.response.out.write(ContactForm())
        self.response.out.write('</table>'
                                '<input type="submit">'
                                '</form></body></html>')
    def post(self):
        #print self.request
        #print self.request.POST
        data = PhoneNumber(data=self.request.POST)
        data2 = Contact(data2=self.request.POST)
        if 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()
            self.redirect('/items.html')
        if data2.is_valid():
            # Save the data, and redirect to the view page
            entity = data2.save(commit=False)
            entity.added_by = users.get_current_user()
            entity.put()
            self.redirect('/items.html')
        else:
            # Reprint the form
            self.response.out.write('<html><body>'
                                    '<form method="POST" '
                                    'action="/">'
                                    '<table>')
            self.response.out.write(data)
            self.response.out.write(data2)
            self.response.out.write('</table>'
                                    '<input type="submit">'
                                    '</form></body></html>')

class ItemPage(webapp.RequestHandler):
    def get(self):
        query = db.GqlQuery("SELECT * FROM PhoneNumber ORDER BY name")
        for item in query:
            self.response.out.write('<a href="/edit?id=%d">Edit</a> - ' %
                                    item.key().id())
            self.response.out.write("%s - Need to buy %d, cost $%0.2f each<br>" %
                                    (item.name, item.quantity, item.target_price))

class EditPage(webapp.RequestHandler):
    def get(self):
        id = int(self.request.get('id'))
        item = Item.get(db.Key.from_path('Item', id))
        self.response.out.write('<html><body>'
                                '<form method="POST" '
                                'action="/edit">'
                                '<table>')
        self.response.out.write(PhoneNumberForm(instance=PhoneNumber))
        self.response.out.write(ContactForm(instance=Contact))
        self.response.out.write('</table>'
                                '<input type="hidden" name="_id" value="%s">'
                                '<input type="submit">'
                                '</form></body></html>' % id)
    def post(self):
        id = int(self.request.get('_id'))
        PhoneNumber = PhoneNumber.get(db.Key.from_path('PhoneNumber', id))
        Contact = Contact.get(db.Key.from_path('Contact', id))
        data = PhoneNumberForm(data=self.request.POST)
        data2 = ContactForm(data2=self.request.POST)
        if 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()
            self.redirect('/items.html')
        if data2.is_valid():
            # Save the data, and redirect to the view page
            entity = data2.save(commit=False)
            entity.added_by = users.get_current_user()
            entity.put()
            self.redirect('/items.html')
        else:
            # Reprint the form
            self.response.out.write('<html><body>'
                                    '<form method="POST" '
                                    'action="/">'
                                    '<table>')
            self.response.out.write(data)
            self.response.out.write(data2)
            self.response.out.write('</table>'
                                    '<input type="submit">'
                                    '</form></body></html>')

def main():
    application = webapp.WSGIApplication(
                                         [('/', MainPage),
                                          ('/edit', EditPage),
                                          ('/items.html', ItemPage),
                                          ],
                                         debug=True)

    run_wsgi_app(application)
if __name__=="__main__":
    main()

3 个答案:

答案 0 :(得分:1)

我没有使用过Django表单,但我的猜测是这样的:

def post(self): 
    #print self.request 
    #print self.request.POST 
    data = PhoneNumberForm(data=self.request.POST) 
    data2 = ContactForm(data=self.request.POST) 
    if data.is_valid() and data2.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() 
        entity = data2.save(commit=False) 
        entity.added_by = users.get_current_user() 
        entity.put() 
        self.redirect('/items.html') 
    else: 
        # Reprint the form 
        self.response.out.write('<html><body>' 
                                '<form method="POST" ' 
                                'action="/">' 
                                '<table>') 
        self.response.out.write(data) 
        self.response.out.write(data2) 
        self.response.out.write('</table>' 
                                '<input type="submit">' 
                                '</form></body></html>') 

表单类不是您需要从self.request.POST创建的模型类。

这些参数有一个叫做data的参数,而不是data2。

答案 1 :(得分:1)

您实际上可以稍微简化一下代码。

class Contact(db.Model):
    name = db.StringProperty()
    birth_day = db.DateProperty()
    address = db.PostalAddressProperty()
    added_by = db.UserProperty(auto_current_user_add=True)

class PhoneNumber(db.Model):
    contact = db.ReferenceProperty(Contact,
                                   collection_name='phone_numbers')
    phone_type = db.StringProperty(
        choices=('home', 'work', 'fax', 'mobile', 'other'))
    number = db.PhoneNumberProperty()
    added_by = db.UserProperty(auto_current_user_add=True)

您不需要在表单的保存方法中添加当前用户,您可以让appengine自动执行。

在你的def post(self):function中,你不应该使用data2参数来实例化表单,这是无效的。我通常做这样的事情:

def post(self):
    form1 =  PhoneNumberForm(self.request.POST or None)
    form2 = Contact(self.request.POST or None)
    if form1.is_valid() and form2.is_valid():
        form1.save()
        form2.save()
    else:
        # re-display page....

你的问题中有两个地方错误地将'data2'传递给表单的构造函数(MainPage类和EditPage类),请务必纠正它们。

答案 2 :(得分:1)

这似乎对我有用。

已更改

data = PhoneNumber(data=self.request.POST)
data2 = Contact(data=self.request.POST)

data = PhoneNumberForm(data=self.request.POST)
data2 = ContactForm(data=self.request.POST)

def post(self):
    #print self.request
    #print self.request.POST
    data = PhoneNumberForm(data=self.request.POST)
    data2 = ContactForm(data=self.request.POST)
    if 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()
        self.redirect('/items.html')
    if data2.is_valid():
        # Save the data, and redirect to the view page
        entity = data2.save(commit=False)
        entity.added_by = users.get_current_user()
        entity.put()
        self.redirect('/items.html')
    else:
        # Reprint the form
        self.response.out.write('<html><body>'
                                '<form method="POST" '
                                'action="/">'
                                '<table>')
        self.response.out.write(data)
        self.response.out.write(data2)
        self.response.out.write('</table>'
                                '<input type="submit">'
                                '</form></body></html>')