2010-09-07 106 views
0

我把谷歌应用程序引擎,创建一个Shoppinglist的官方例子,修改它,所以它会:谷歌App Engine的例子,改装

创建两个表,而不是一个Shoppinglist(接触和PhoneNumber)。 这是为了了解google如何处理两个表和Foreignkey(请参阅下面的代码)。

它显示一切直到线47:

数据= ******中国(数据= self.request.POST) DATA2 =端子(DATA2 = self.request.POST)

不知何故它不能处理该第二个“数据2”对象,并给了我和错误:

类型错误:初始化()得到了一个意想不到的关键字参数“数据2”

为什么? 我能做些什么才能使它工作?

谢谢你的时间。

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() 

回答

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。

这些有一个参数称为数据,而不是data2。

+0

感谢会尝试! – MacPython 2010-09-10 09:54:36

+0

没有工作。 Errror: – MacPython 2010-09-10 10:05:36

+0

TypeError:__init __()得到了一个意想不到的关键字参数'data2' – MacPython 2010-09-10 10:06:12

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):函数中,你不应该用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.... 

有你的问题两个点,你被错误地传递“数据2”到窗体的构造函数(MainPage类和EditPage类),一定要纠正他们。

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>')