Как сделать что-то редактируемое всеми, следя за историей?
Я хочу добавить вики-функцию в мой уже существующий проект.
Единственный разумный пример, который я нашел, предложил просто добавить логическое поле "is_published" и иметь несколько версий с одним и тем же фрагментом, где только одна версия каждого фрагмента когда-либо публикуется.
Теперь я нахожу некоторые проблемы с этой идеей, потому что мне нужно, чтобы 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 ответа
Есть простой способ сделать это, но вам придется отказаться от уникальности 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=3 в качестве текущей версии, вы просто сохраните / обновите ее снова!
Надеюсь это поможет!
Для этого есть приложения Django. например: https://github.com/etianen/django-reversion