Определение начальных значений ModelForm в админке Django с использованием содержимого запроса
Я пытаюсь предварительно заполнить ModelForm
для интерфейса администратора моего приложения Django. Я храню некоторые значения в request.session
и хочу использовать их для определения параметра initial
моего ModelForm
. Я могу получить эти значения в ModelAdmin.render_change_form(self, request, context, *args, **kwargs)
, но я не уверен, как передать их форме. Возможно ли это сделать? Думаю, мне следует использовать фабрику классов (вдохновляясь этим ответом), но я не уверен, где ее вызвать, поскольку ModelAdmin.form
- это атрибут класса, а не атрибут экземпляра.
Ниже приведена краткая версия кода, который я использую.
## admin.py
@admin.register(Game)
class GameAdmin(admin.ModelAdmin):
# ...
# This is where I'd like to pass the value of request.session["prefill_data"]
form = GameAdminForm() # inherits forms.ModelForm()
def render_change_form(self, request, context, *args, **kwargs):
self.change_form_template = 'my_app/admin_game.html'
extra_context = {}
if "prefill_data" in request.session:
# I'm able to access this data here
extra_context["something_available_for_the_template"] = something_i_did_with prefill_data
# Once I've done what I need I can safely delete the session variable
del request.session["prefill_data"]
return super(GameAdmin, self).render_change_form(request, context | extra_context, *args, **kwargs)
# This is actually the view that populates request.session
def admin_prefill(self, request):
# [something something]
request.session["prefill_data"] = foo
# This adds the aforementioned view
def get_urls(self):
urls = super().get_urls()
extra_urls = [
path("prefill", self.admin_prefill, name="stats_game_prefill"),
]
return extra_urls + urls