我正在尝试为我的 Django 应用程序的管理界面预填充一个ModelForm
。我在其中存储了一些值,request.session
我想用它们来定义initial
my 的参数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