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
Однако, все дополнительные формы будут содержать одинаковые значения.
Если вы знаете, как мы можем использовать индекс там, это улучшит этот ответ.