2012-05-16 40 views
1

我正在使用WTFor与GAE并试图找出设置key_name值的最佳方法。这工作,但它不是很干净。具体来说,P =帖子(KEY_NAME ...线似乎是多余的保存key_name值GAE和WTforms

class CreatePost(BaseHandler): 
def post(self): 
    form = MyForm(self.request.POST) 
    if form.validate(): 
     p = Posts() 
     p.author = users.get_current_user() 
     p.title = form.title.data 
     p.path = format_post_path(p) 
     p.content = form.content.data 
     p = Posts(key_name=p.path, author=p.author, 
         title=p.title, content=p.content, path=p.path) 
     p.put() 
     return webapp2.redirect('/admin/') 
    else: 
     self.render_template('create.html', {'form':form}) 

我试图做到这一点,但它不工作

class CreatePost(BaseHandler): 
def post(self): 
    form = MyForm(self.request.POST) 
    if form.validate(): 
     p = Posts() 
     p.author = users.get_current_user() 
     p.title = form.title.data 
     p.path = format_post_path(p) 
     p.content = form.content.data 
     p.key_name = p.path 
     p.put() 
     return webapp2.redirect('/admin/') 
    else: 
     self.render_template('create.html', {'form':form}) 

我的问题:什么是?写这个最好的办法,为什么不p.key_name = p.path工作

更新1

下面是相关代码:

from models import Posts 
import fix_path 
import wtforms 
from wtforms.ext.appengine.db import model_form 
from wtforms import Form, TextField, validators 

MyForm = model_form(Posts, Form, field_args = { 
    'title' : { 
     'validators' : [validators.Length(min=1, max=25)] 
    }, 
    'content' : { 
     'validators' : [validators.Length(min=4, max=100000)] 
    } 
}) 

def slugify(s): 
    s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').lower() 
    return re.sub('[^a-zA-Z0-9-]+', '-', s).strip('-') 


def format_post_path(p): 
    slug = slugify(p.title) 
    return config.post_path_format % { 
     'slug': slug, 
     'year': p.date_create.year, 
     'month': p.date_create.month, 
     'day': p.date_create.day, 
    } 

class BaseHandler(webapp2.RequestHandler): 

    @webapp2.cached_property 
    def jinja2(self): 
     return jinja2.get_jinja2(app=self.app) 

    def render_template(
     self, 
     filename, 
     template_values, 
     **template_args 
     ): 
     template = fix_path.jinja_environment.get_template(filename) 
     self.response.out.write(template.render(template_values)) 

class CreatePost(BaseHandler): 
    def post(self): 
     form = MyForm(self.request.POST) 
     if form.validate(): 
      p = Posts() 
      p.author = users.get_current_user() 
      p.title = form.title.data 
      p.path = format_post_path(p) 
      p.key_name = p.path #this part doesn't work. 
           #No error. Just not value 
           #passed to datastore. 
      p.content = form.content.data 
      p.put() 
      return webapp2.redirect('/admin/') 
     else: 
      self.render_template('create.html', {'form':form}) 

    def get(self): 

     MyForm = model_form(Posts, Form) 
     self.render_template('create.html', {'form':MyForm()}) 

从配置文件

post_path_format = '/%(year)d/%(month)02d/%(slug)s' 

我只是不明白,为什么我可以使用p.key_name = p.path格式(如第一个片段)。为什么我要对你的帮助做P =帖子(KEY_NAME =路径,笔者= p.author .....(像第二个片段)

感谢。

+0

你得到的错误是什么?你的模型是怎样的?另一件事是 – aschmid00

+0

。我会将模型称为Post而不是Posts。 format_post_path(路径)做什么? – aschmid00

回答

0

它看起来像你创造一个临时职位实体,然后利用它的“路径”,以创建另一个帖子的实体,您实际保存。这是搞砸了在许多方面。

class CreatePost(BaseHandler): 
    def post(self): 
     form = MyForm(self.request.POST) 
     if form.validate(): 
      p = Posts(key_name=???, users.get_current_user(), title=p.title, content=form.content.data, path=???) 
      p.put() 
      return webapp2.redirect('/admin/') 
     else: 
      self.render_template('create.html', {'form':form}) 

这留下的问题,什么是“道”?你需要在不使用现有实体的情况下生成“路径”

另外,如果“路径”是实体a ncestor路径,我不认为这就是你真正想要的关键名称。

+0

问题是在第二个片段中,他使用一个函数来格式化''format_post_path(p)''传入'p'的路径,其中'Posts()'具有设置属性'title'和'author',我们不知道这个功能实际上做了什么。它可能使用key_name的非法字符,但它也可能在函数中失败。但我同意这段代码非常糟糕。 – aschmid00

+0

我已经添加了format_post_path(p)函数的代码。我知道这个函数可以工作,因为第一个代码片段将路径和密钥提交到数据存储就好了。我的问题是为什么第二个不工作?为什么我不能只做p.key_name = p.path? – Busilinks

+0

@Busilinks:只要你不提供追踪,就很难猜测问题实际是什么。 – aschmid00