(Udacity + GAE)创建表单以编辑现有的ndb实体

时间:2013-11-14 18:41:03

标签: python google-app-engine google-cloud-datastore

我正在使用Google AppEngine(Python)开始我的第一个小项目,由Udacity辅导。我和Drupal一起工作过。

我想在每个作业实体的页面中创建一个“编辑”链接,这将允许其作者更新实体的字段。我不太确定在哪里或如何开始实现这一目标。任何帮助都将非常感激。

这是我到目前为止所做的:

main.py:

import webapp2
import jinja2
import os
import cgi
import urllib
from google.appengine.ext import ndb


template_dir = os.path.join(os.path.dirname(__file__), 'templates')
env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), 
                        autoescape = True)


def render_template(template, **params):
    t = env.get_template(template)
    return t.render(params)


# B A S E H A N D L E R #
#########################

class BaseHandler(webapp2.RequestHandler):

    def write(self, *a, **kw):
        self.response.write(*a, **kw)

    def render(self, template, **kw):
        self.response.write(render_template(template, **kw))


# M A I N P A G E #
###################

class MainPage(BaseHandler):
    def get(self):
        jobs = Job.query()
        self.render('index.html', jobs = jobs)

# J O B   E N T I T Y #
#######################

class Job(ndb.Model):
    title = ndb.StringProperty(required = True)
    description = ndb.TextProperty(required = True)
    requirements = ndb.TextProperty()
    created = ndb.DateTimeProperty(auto_now_add = True)

class JobHandler(BaseHandler):
    pass
    # Created this empty class to organise its subclasses,
    # because they perform 'Job' functions.
    # Is this a good practice?

class NewJob(JobHandler):

    def get(self):
        self.render('newjob.html')

    def post(self):
        title = self.request.get('title')
        description = self.request.get('description')
        requirements = self.request.get('requirements')

        if title and description:
            j = Job(title = title, 
                    description = description, 
                    requirements = requirements)
            j.put()
            self.redirect('/job/%s' % str(j.key.id()))
        else:
            self.render('newjob.html')


class JobPage(JobHandler):

    def get(self, job_id):
        j = Job.get_by_id(int(job_id))
        self.render('jobpage.html', j = j)

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/newjob', NewJob),
    ('/job/([0-9]+)', JobPage),
], debug=True)

newpage.html:

{% extends "base.html" %}

{% block content %}

<form method="post">

    <div>
        <label>Job Title:<br> 
            <input type="text" name="title" value="{{title}}">
        </label>
    </div>

    <div>
        <label>Description:<br> 
            <textarea name="description" col="60">{{description}}</textarea>
        </label>
    </div>

    <div>
        <label>Requirements:<br> 
            <textarea name="requirements" col="60">{{requirements}}</textarea>
        </label>
    </div>

    <input type="submit">

</form>

{% endblock %}

最后,jobpage.html

{% extends "base.html" %}

{% block content %}
    {{j.title}}
    {{j.description}}
    {{j.requirement}}
    {{j.created.strftime("%b %d, %Y")}}
{% endblock %}

1 个答案:

答案 0 :(得分:1)

您应该为您的网站添加编辑处理程序。类似于('/ job /([0-9] +)/ edit',EditJobPage)应该这样做。在确认正确的作者已登录后,它可以提取作业并将值放在Get请求的文本字段中。然后它的Post函数可以接受编辑的字段并相应地更新Job。

然后,您可以在请求时将此链接直接添加到Job html。

(显然只有在作者登录后才能这样做)

<a href="/job/{{j.key.id()}}/edit}">

确保在允许get和(更重要的是)post请求继续执行之前确认作者已登录!

编辑:  我实际上没有回答有关如何编辑现有ndb实体的问题。完成的方法是查询实体,将值重新分配给实体变量,然后放置它。

job_to_edit = Job.get_by_id(job_id)  # or ndb.Key(Job, job_id).get()
job_to_edit.description = new_description
job_to_edit.put()
# Tada!

免责声明:我唯一的经验是参加这个Udacity课程。

相关问题