如何递归获取get_absolute_url中的pk

时间:2019-06-20 18:46:58

标签: django python-3.x

通过使用inlineformset,我已经创建了一个createview,一切都很好,但是,我需要将用户重定向到创建的作者详细信息视图。

  

如何使用模型中的get_absolute_url获取作者ID   书吗?

我将在以下代码中解释我的所作所为。

  

首先,我有两个具有关联关系的模型:作者和书本。

php.ini
  

在这里,我有表单集。

class Author(models.Model):
    description = models.CharField("Description", max_length=150)
    author = models.ForeignKey(
        "Book",
        verbose_name=_("Book"),
        on_delete=models.PROTECT
    )

    class Meta:
        verbose_name = _("Author")
        verbose_name_plural = _("Authors")


class Book(models.Model):
    name = models.CharField("Book Name", max_length=150)

    class Meta:
        verbose_name = _("Book")
        verbose_name_plural = _("Books")

    def get_absolute_url(self):
        return reverse('author-detail', args=(need author pk here,))
  

在这里,我有我的看法。

AuthorFormSet = forms.inlineformset_factory(
    Book,
    Author,
    form=AuthorForm,
    fields = ['description'],
    extra=2
)

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

建模看起来有点“偏离”。在这里,您在ForeignKey模型中制作了一个Author(指向该外键名为Book),并author。因此,这意味着根据您的建模。 Author精确地写成一个Book ,而Book可以被零个,一个或多个作者写成。

其余的表单和视图也似乎将两者互换。例如,您使用模型BookAuthorCreateView制作了Book,但是您似乎在这里创建了Author对象。如果您目前不太关心这些关系,并尝试分别为BookAuthor实现表单,那么这可能会有所帮助。

就像您想要反向关系一样,因为Book有一个作者。您可以这样写:

class Author(models.Model):
    description = models.CharField("Description", max_length=150)
    # no author foreign key

    class Meta:
        verbose_name = _("Author")
        verbose_name_plural = _("Authors")


class Book(models.Model):
    name = models.CharField("Book Name", max_length=150)
    author = models.ForeignKey(
        'Author',
        verbose_name=_('Author'),
        on_delete=models.PROTECT
    )

    class Meta:
        verbose_name = _("Book")
        verbose_name_plural = _("Books")

    def get_absolute_url(self):
        return reverse('author-detail', args=(self.author_id,))

然后您可以使用self.author_id来检索相关Author对象的主键。

Bookauthor的详细信息页面而不是本书本身的名称指定为“ 模型URL ”仍然有点奇怪。