как получить pk в get_absolute_url рекурсивно - PullRequest
0 голосов
/ 20 июня 2019

Используя inlineformset, я создал createview, все работает очень хорошо, но мне нужно перенаправить пользователя в подробное представление созданного автора.

Как я могу получить идентификатор автора, используя get_absolute_url в модели Книга

Я объясню в следующем коде, что я сделал.

Во-первых, у меня есть две модели отношений, Автор и Книга.

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
)

И вот у меня есть мой взгляд.

class BookAuthorCreateView(CreateView):
    model = Book
    fields = ['name']
    template_name = "core/formset.html"

    def get_context_data(self, **kwargs):
        data = super(
            BookAuthorCreateView, self).get_context_data(**kwargs
        )
        if self.request.POST:
            data['formset'] = AuthorFormSet(self.request.POST)
        else:
            data['formset'] = AuthorFormSet()

        return data

    def form_valid(self, form, *args):
        context = self.get_context_data()
        authors = context['formset']

        with transaction.atomic():
            self.object =  form.save()

            if authors.is_valid():
                authors.instance = self.object
                authors.save()

        return super(BookAuthorCreateView, self).form_valid(form)

Спасибо за ваше время.

1 Ответ

0 голосов
/ 20 июня 2019

Моделирование выглядит немного "выключенным".Вы сделали ForeignKey в модели Author, которая указывает на Book (и этот внешний ключ называется author).Таким образом, это означает, что согласно вашему моделированию.Author записывает в точности один Book, а Book может быть записано нулем, одним или несколькими авторами.

Остальные ваши формы и представления также могут поменяться местами.два.Например, вы делаете BookAuthorCreateView в качестве модели Book, но вы, похоже, создаете Author объекты здесь.Вероятно, это поможет, если вы в настоящее время не очень заботитесь об отношениях и попытаетесь реализовать формы для Book и Author по отдельности.

Скорее всего, вам нужно обратное отношение, как в случае Book имеет автора.Вы можете написать это как:

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

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


class Book(models.Model):
    name = models.CharField("Book Name", max_length=150)
    <b>author</b> = 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=(<b>self.author_id</b>,))

Затем вы можете использовать, self.author_id, чтобы получить первичный ключ связанного Author объекта.

Все еще немного странно, что выукажите url модели для Book, страницы сведений о author, а не самой книги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...