3

我正在使用 Udacity 指导的 Google AppEngine (Python) 开始我的第一个小项目。我曾与 Drupal 合作过。

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

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

主要.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 %}
4

1 回答 1

1

您可能应该向您的网站添加一个编辑处理程序。('/job/([0-9]+)/edit', EditJobPage) 之类的东西应该可以。在确认正确的作者登录后,它可以拉起 Job 并将值放在 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 课程。

于 2013-11-14T19:13:39.783 回答