如何访问由外键连接的两个模型的DetailView和CreateView?

时间:2019-07-02 12:38:04

标签: django django-models django-templates django-views django-2.2

我正在构建一个Wiki,需要保存为每个Wiki页面所做的每个修订。这意味着我需要为每个创建的Wiki页面创建一个新的修订表格。

当使用DetailView呈现每个Wikipage模板时,我需要访问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

我想使用django随附的DetailView和CreateView,但是我没有成功从两个表中访问特定数据。 我已经使ListView正常工作,但是只需要Wikipage中的标题,而不需要Revision中的内容。

2 个答案:

答案 0 :(得分:0)

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')

答案 1 :(得分:0)

由于您在修订版本模型上正确定义了wikipage.revision.latest(),因此可以通过get_latest_by访问维基页面的最新修订。您可以直接在模板中执行此操作:

{% with wikipage.revision.latest as revision %}
  {{ revision.last_edit }}
  {{ revision.comment }}
{% endwith %}