0

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

0 回答 0