Как я могу получить доступ к двум моделям, связанным внешним ключом, для DetailView и CreateView? - PullRequest
1 голос
/ 02 июля 2019

Я строю вики и мне нужно сохранять каждую ревизию, сделанную для каждой вики.Это означает, что мне нужна новая таблица ревизий для каждого созданного вики-сайта.

При представлении каждого шаблона вики-страницы с DetailView мне требуется доступ к Wikipage.title, последней ревизии и ее Revision.content, Revision.author, Revision.last_edit и Revision.comment.Я смог получить доступ к названию, установив «model = Wikipage» и ревизию, установив «model = Revision», но не оба одновременно.

models.py

class Wikipage(models.Model):
    title = models.CharField(max_length=100)
    date_created = models.DateTimeField('Created', auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = "Wikipages"


class Revision(models.Model):
    wikipage = models.ForeignKey(Wikipage, null=True, 
               on_delete=models.CASCADE, related_name='revision')
    content = models.TextField('Content')
    author = models.ForeignKey(User, null=True, 
             on_delete=models.SET_NULL)
    last_edit = models.DateTimeField('Last edit', auto_now=True)
    comment = models.TextField('Comment', blank=True)

    class Meta:
        verbose_name = 'Revision'
        verbose_name_plural = 'Revisions'
        ordering = ['-last_edit']
        get_latest_by = ['last_edit']

    def __str__(self):
        return self.content

Я хотел использовать DetailView и CreateView, которые поставляются с django, но мне не удалось получить доступ к конкретным данным из обеих таблиц.Я получил ListView для правильной работы, но для этого нужен только заголовок из Википедии, а не Revision.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Вы можете получить доступ к последней редакции вики-страницы через wikipage.revision.latest(), поскольку вы правильно определили get_latest_by в модели Revision.Вы можете сделать это прямо в шаблоне:

{% with wikipage.revision.latest as revision %}
  {{ revision.last_edit }}
  {{ revision.comment }}
{% endwith %}
0 голосов
/ 02 июля 2019

На DetailView вы можете получить доступ ко всем ревизиям, используя wikipage.revision, где wikipage - объект DetailView, и вы можете запросить ревизии, чтобы получить самую последнюю.

Я бы порекомендовал также это изменение

wikipage = models.ForeignKey(Wikipage, null=True, on_delete=models.CASCADE, related_name='revision')

будет

wikipage = models.ForeignKey(Wikipage, null=True, on_delete=models.CASCADE, related_name='revisions')
...