如何在跟踪历史的同时让每个人都可以编辑?

时间:2015-03-29 17:53:59

标签: django django-1.7

我想在我现有的项目中添加一些类似wiki的功能。

我发现的唯一合理的例子建议只添加一个“is_published”布尔字段,并且有多个版本具有相同的slug,其中每个slug只发布一个版本。

现在我发现这个想法有些麻烦,因为我需要slug和ID对每个对象都是唯一且不变的,因为我在url中使用了这些属性。

所以我想做这样的事情。

想象一下,我有一个模特:

class Post(models.Model):
  user = models.ForeignKey('auth.User')
  slug = models.SlugField()
  subject = models.CharField(max_length=255)
  body = models.TextField()

现在我想试试这个:

class Post(models.Model):
  user = models.ForeignKey('auth.User')
  slug = models.SlugField()
  cv = models.ForeignKey('myapp.Version') // current version

class Version(models.Model):
  user = models.ForeignKey('auth.User') // this is the editor
  subject = models.CharField(max_length=255)
  body = models.TextField()
  post = models.ForeignKey('myapp.Post', related_name="all_versions")

这将允许我像以前一样使用Post对象进行最小的更改。当我想访问主题或正文时,我只需要添加“cv”。与select_related一起使用时,不应使用其他资源。

有更好的方法吗?

是否有一种方法可以消除插入“cv”的需要?

2 个答案:

答案 0 :(得分:1)

有一种简单的方法可以做到,但你必须放弃SlugField的唯一性。

class Post(models.Model):
    user = models.ForeignKey('auth.User')
    slug = models.SlugField(unique=False)
    subject = models.CharField(max_length=255)
    body = models.TextField()
    version = models.DateTimeField(auto_now_add=True, auto_now=True)

您在视图中执行的操作只是使用相同的段塞拉实例并按日期排序,最新日期显然是当前版本。

然后在您的模板中,您将id字段用作get变量,版本的重定向url应如下所示:
http://someurl.com/this-unique-post?v=3

如果3是该帖子版本的ID,那么如果你想制作,比如id = 3的版本作为当前版本,你只需要再次保存/更新它!

希望这有帮助!

答案 1 :(得分:0)

有django应用程序。例如:https://github.com/etianen/django-reversion