Пример Google App Engine изменен - PullRequest
       3

Пример Google App Engine изменен

0 голосов
/ 07 сентября 2010

Я взял официальный пример Google App Engine, который создает список покупок, и изменил его таким образом:

Создайте две таблицы (контакт и номер телефона) вместо одного списка покупок.Это необходимо для того, чтобы понять, как Google работает с двумя таблицами и с Foreignkey (см. Код ниже).

Отображает все до строки 47:

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

Каким-то образом он не может иметь дело со вторым объектом "data2" и выдает мне сообщение об ошибке:

Ошибка типа: 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 ]

1 голос
/ 20 сентября 2010

Вы могли бы немного упростить ваш код.

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), обязательно исправьте их оба.

1 голос
/ 10 октября 2010

Мне показалось, что это работает.

Изменено

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>')
1 голос
/ 07 сентября 2010

Я не использовал формы 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...