1

私は GAE で WTforms を使用しており、key_name 値を設定する最良の方法を見つけようとしています。これは機能しますが、あまりきれいではありません。具体的には、 p = Posts(key_name... 行は冗長に見えます。

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 = Posts(key_name=path, author=p.author..... を実行する必要があるのはなぜですか (2 番目のスニペットのように)

ご協力いただきありがとうございます。

4

1 に答える 1

0

一時的なPostsエンティティを作成し、その「パス」を使用してさらに別のPostsエンティティを作成し、実際に保存しているようです。それは非常に多くの方法で台無しにされています。

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

これは疑問を残します、「パス」とは何ですか?既存のエンティティを使用せずに「パス」を生成する必要があります。

また、「パス」がエンティティの祖先パスである場合、それが実際にキー名に必要なものではないと思います。

于 2012-05-16T17:29:32.747 に答える