2011-10-04 40 views
0

我有一種形式,用戶使用谷歌帳戶登錄,然後在谷歌應用程序引擎中製作或更新其個人資料。我想使用包含他們的電子郵件地址的表單域(該域自動填充來自谷歌的用戶信息)作爲新條目的關鍵字。這樣我就可以輕鬆地更新條目,因爲只要他們具有相同的電子郵件地址,他們將是相同的條目。這裏是我的表單模型和我的頁面發佈和獲取方法,我如何修改它們來設置密鑰?使用表單字段作爲實體鍵谷歌應用程序引擎python

class Athlete(db.Model):           
    #fields to be added to the form 
    norse_key = db.UserProperty() 
    key_name = norse_key 
    first_name = db.StringProperty() 
    last_name = db.StringProperty() 
    school_class = db.StringProperty() 
    sex = db.StringProperty() 
    home_address = db.StringProperty() 
    city = db.StringProperty() 
    state = db.StringProperty() 
    zip = db.IntegerProperty() 
    residence = db.StringProperty() 
    SPO = db.IntegerProperty() 
    cell = db.IntegerProperty 
    sport_1 = db.StringProperty() 
    sport_2 = db.StringProperty() 
    sport_3 = db.StringProperty() 

class AthleteForm(djangoforms.ModelForm): 
    class Meta(): 
     model = Athlete() 
class AthleteFormPage(webapp.RequestHandler): 

    def get(self): 
     user = users.get_current_user() 
     self.response.out.write((user)) 
     query = db.GqlQuery("SELECT * FROM Athlete WHERE norse_key = :1", user) 
     item = None 
     for item in query: 
      self.response.out.write("%s,%s<br>" % (item.norse_key,item.first_name))  
     self.response.out.write('<div style="float:right"><a href="%s">Log Out</a> </div >'% (users.create_logout_url("/"))) 

     self.response.out.write('<html> <body> <a href="/">Submit A Treatment Log</a> <form method="POST" action="/athleteformpage.html"> <table>') 
     if item != None: 
      self.response.out.write(AthleteForm(initial={'norse_key':item.norse_key,'first_name':item.first_name})) 
     else: 
      self.response.out.write(AthleteForm(initial={'norse_key':user})) 
     self.response.out.write('</table> <input type="submit"> </form> </body> </html>') 


    def post(self): 
     data = AthleteForm(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('/athletes.html') 
     else: 
      # Reprint the form 
      self.response.out.write('<html><body> <form method="POST" action="/athleteformpage.html"> <table>') 
      self.response.out.write(data) 
      self.response.out.write('</table> <input type="submit"> </form></body></html>') 
+1

除非性場可以有像「是的請」或「一週三次」 「它應該是一個布爾屬性,而不是一個StringProperty –

+0

問題不清楚......你不是已經用'db.UserProperty()'來做這個嗎?它會工作,你打算與'db.UserProperty(auto_current_user = True)'?或'user = users.get_current_user(); user_email = user.email()'?回答一個沒有道理的問題很難。除此之外,[用戶可以更改Google帳戶的電子郵件地址](http://code.google.com/appengine/docs/python/users/userclass.html#Introduction),所以這是一個有缺陷的前提。 –

+0

在該領域的良好呼聲,我會讓它成爲一個下拉菜單,這個項目還處於發展初期。而這個應用程序將是一個使用谷歌領域的大學,並且你不允許改變你的大學谷歌電子郵件,這樣就不會出現問題,但是謝謝你指出它以備將來參考。 – marblecatdog

回答

2

GAE數據存儲中的每個實體都有一個密鑰,密鑰可以是一個id或字符串。
創建實體時,您可以使用key_name屬性指定密鑰的值。例如:

Athlete.get_or_insert(key_name=name, ....) 

您可以刪除你把你的模型,並用自帶「開箱即用」

來查詢使用KEY_NAME使用Athlete.get_by_key_name(name)的實體之一KEY_NAME。
請注意,密鑰是區分大小寫的,所以你很可能需要使它成爲規範(通過下殼,也可能是url解碼)

+0

是的,這適用於添加key_name,非常感謝! – marblecatdog

+0

不清楚這個答案:鍵名僅適用於字符串值。 Int值是ID,兩者是互斥的。 –