我想在我现有的项目中添加一些类似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”的需要?
答案 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