Django Admin - Как предварительно заполнить add inline формы значениями, отправленными через querystring?

Я могу заполнить форму, используя параметры строки запроса в Django Admin.

Допустим, у меня есть следующие модели:

class Book(models.Model):
    id = models.Autofield(primary_key=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    name = models.Charfield(max_length=200)


class Author(models.Model):
    id = models.Autofield(primary_key=True)
    name = models.Charfield(max_length=200)

Если я перейду на /admin/library/author/add/?name=J.+K.+Rowling имя автора будет правильно заполнено.

Однако, если я добавлю InlineForms следующим образом:

class BookInline(StackedInline):
    model = Book
    extra = 0

class AuthorAdmin(ModelAdmin):
    inlines = [BookInline]

admin.site.register(Author, AuthorAdmin)

Я не могу заполнять книги.

Я пытался: /admin/library/author/add/?name=J.+K.+Rowling&books-TOTAL_FORMS=1&books-0-name=Harry+Potter+and+the+Philosopher's+Stone

Форма автора заполнена, но форма первой книги не заполнена. Не знаете ли вы, как с этим справиться?

Если вы переопределите get_formset_kwargs, вы можете предварительно заполнить формы некоторыми начальными значениями:

class AuthorAdmin(ModelAdmin):
    inlines = [BookInline]

    def get_formset_kwargs(self, request, obj, inline, prefix):
        formset_params = super().get_formset_kwargs(request, obj, inline, prefix)
        if request.method == "GET":
            # Mind you, this will prefill all form of the formset with the same values.
            # But for our usecase it is sufficient.
            prefix_length = len(prefix) + 3
            initial_values = [{key[prefix_length:]: value for key, value in request.GET.items() if key.startswith(prefix)}]
            formset_params.update(initial=initial_values)
        return formset_params

Однако, все дополнительные формы будут содержать одинаковые значения.

Если вы знаете, как мы можем использовать индекс там, это улучшит этот ответ.

Вернуться на верх