django - Django - 如何在管理表单中设置请求?
问题描述
我有一个使用请求对象的表单:
class FooForm(forms.ModelForm):
class Meta:
model = Foo
fields = ('title', )
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
在我看来,每当我想实例化表单时,只需执行以下操作即可:
class FooCreateView(LoginRequiredMixin, CreateView):
model = Foo
form_class = FooForm
def get_form_kwargs(self):
kwargs = super(FooCreateView, self).get_form_kwargs()
kwargs.update({'request': self.request})
return kwargs
现在,我想在管理面板中使用相同的表单,所以我执行以下操作:
class FooAdmin(admin.ModelAdmin):
form = FooForm
但是轰隆隆!它死了:
KeyError at /admin/foo/foo/add/
'request'
我尝试执行以下操作,但没有成功
def get_form(self, request, *args, **kwargs):
form = super(FooAdmin, self).get_form(request, *args, **kwargs)
form.request = request
kwargs['request'] = request
return form
总之,有没有办法将请求传递给管理表单?
解决方案
该get_form()
方法只返回类,而不是它的实例。表单的实例化隐藏在 的add_view
和change_view
方法中ModelAdmin
。您可以通过在方法中创建一个新的表单类来以某种方式解决这个问题get_form
:
def get_form(self, request, obj=None, **kwargs):
FooForm = super(FooAdmin, self).get_form(request, obj, **kwargs)
class RequestFooForm(FooForm):
def __new__(cls, *args, **kwargs):
kwargs['request'] = request
return FooForm(*args, **kwargs)
return RequestFooForm
否则,如果您只需要在保存期间访问,您可能还可以查看模型管理员save_form
和save_model
方法。
推荐阅读
- docker-compose - Docker compose 将构建上下文视为相对路径而不是 URL
- .htaccess - 如何根据每年的某一天重定向到子目录
- javascript - 刷新html输入元素值
- javascript - 将不透明度滑块添加到 Openlayers 地图
- angular - 尝试使用 amcharts 重现有向图时出现错误:“找不到导出“默认”(导入为“am4plugins_forceDirected”)
- amazon-web-services - 在 Quicksight 中过滤自动发现的 RDS 实例列表
- sql - 有什么方法可以明智地合并行吗?
- c# - 为什么我在编辑器窗口中得到一些奇怪的图画,其中一些对话/句子相互绘制?
- r - 隐式 NA 在 Tidyverse 中制作表格
- sql-server - 使用 FULL OUTER JOIN 时缺少一些行