在Google App Engine/Django上存储Wiki修订 - 修改现有代码

0 投票
2 回答
762 浏览
提问于 2025-04-15 15:09

以前,我创建了一个Django维基网站,制作一个页面表来存储当前的维基条目非常简单,然后把旧版本存到一个修订表里。

最近,我决定在Google App Engine上搭建一个网站,使用了另一个程序员写的一些维基代码。因为他创建的页面模型用了一种对我来说比较复杂的方式(至少我觉得复杂),使用了实体,所以我不太确定该如何创建修订表,并把它和他的页面模型结合起来。

这里是相关的代码。有人能帮我写一下修订模型,并把保存修订的功能整合到页面模型的保存方法里吗?

class Page(object):

  def __init__(self, name, entity=None):
    self.name = name
    self.entity = entity
    if entity:
      self.content = entity['content']
      if entity.has_key('user'):
        self.user = entity['user']
      else:
        self.user = None
      self.created = entity['created']
      self.modified = entity['modified']
    else:
      # New pages should start out with a simple title to get the user going
      now = datetime.datetime.now()
      self.content = '<h1>' + cgi.escape(name) + '</h1>'
      self.user = None
      self.created = now
      self.modified = now

  def save(self):
    """Creates or edits this page in the datastore."""
    now = datetime.datetime.now()
    if self.entity:
      entity = self.entity
    else:
      entity = datastore.Entity('Page')
      entity['name'] = self.name
      entity['created'] = now
    entity['content'] = datastore_types.Text(self.content)
    entity['modified'] = now

    if users.GetCurrentUser():
      entity['user'] = users.GetCurrentUser()
    elif entity.has_key('user'):
      del entity['user']

    datastore.Put(entity)

顺便说一下,这段代码来自: http://code.google.com/p/google-app-engine-samples/downloads/list

我对GAE Django模型还很不熟悉,我的模型通常都很简单。例如,这是我为博客文章写的模型:

class Article(db.Model):
  author = db.UserProperty()
  title = db.StringProperty(required=True)
  text = db.TextProperty(required=True)
  tags = db.StringProperty(required=True)
  date_created = db.DateProperty(auto_now_add=True)

2 个回答

1

你第一个代码片段里的内容其实不是一个模型,而是一个自定义的类,它使用了比较底层的数据存储模块。如果你想要扩展这个功能,我建议你把它扔掉,换成真正的模型,就像你在第二个代码片段中展示的文章模型那样。

另外,这些是App Engine的模型,而不是Django的模型——Django的模型在App Engine上是不能用的。

0

我创建了这个模型(它模仿了Page类):

class Revision (db.Model):
  name = db.StringProperty(required=True)
  created = db.DateTimeProperty(required=True)
  modified = db.DateTimeProperty(auto_now_add=True)
  content = db.TextProperty(required=True)
  user = db.UserProperty()

在Page类的Save()方法中,我添加了这段代码,用来保存一个修订版本,然后再用新数据更新字段:

r = Revision(name = self.name,
             content = self.content,
             created = self.created,
             modified = self.modified,
             user = self.user)
r.put()

现在我已经设置好维基,可以接受一个GET参数来指定你想查看或编辑哪个修订版本。当用户想要某个修订版本时,我会从数据库中获取这个页面,并用修订版本的内容替换页面的内容:

page = models.Page.load(title)

if request.GET.get('rev'):
  query = db.Query(models.Revision)
  query.filter('name =', title).order('created')
  rev = request.GET.get('rev')
  rev_page = query.fetch(1, int(rev))
  page.content = rev_page.content

撰写回答