Как сделать что-то редактируемое всеми, следя за историей?

Я хочу добавить вики-функцию в мой уже существующий проект.

Единственный разумный пример, который я нашел, предложил просто добавить логическое поле "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

Другие вопросы по тегам