Python Django admin:在呈现之前更改表单中的字段值

Python Django admin:在呈现之前更改表单中的字段值,python,django,django-forms,django-admin,django-models,Python,Django,Django Forms,Django Admin,Django Models,自定义视图中有一个链接指向特定模型实例的Django管理更改表单。目标是在表单呈现之前更改一些表单字段的值,就像可以通过添加参数(ModelFieldName=value)来添加表单URL来预填充addform中的字段一样。如何在渲染前更改更改表单字段中的值?也许,我必须创建我的ModelForm,更改其中的字段值,并分配给ModelAdmin的form变量?如果是这样,如何更改ModelForm字段的值?我刚刚发现ModelAdmin.add\u视图使用request.GET在django/c

自定义视图中有一个链接指向特定模型实例的Django管理更改表单。目标是在表单呈现之前更改一些表单字段的值,就像可以通过添加参数(ModelFieldName=value)来添加表单URL来预填充addform中的字段一样。如何在渲染前更改更改表单字段中的值?也许,我必须创建我的ModelForm,更改其中的字段值,并分配给ModelAdmin的form变量?如果是这样,如何更改ModelForm字段的值?

我刚刚发现ModelAdmin.add\u视图使用request.GET在django/contrib/admin/options.py行900中设置initial

所以,要用“bar”预填充someapp.somemodel添加表单的“name”字段,只需打开:/admin/someapp/somemodel/add/?name=bar即可

现在,如果希望在更改表单中有类似的行为,请重写get_object方法,如下所示:

def get_object(self, request, object_id):
    obj = super(YourModelAdmin, self).get_object(request, object_id)
    for key, value in request.GET.items():
        setattr(obj, key, value)
    return obj
现在打开/admin/someapp/somemodel/1/?name=bar,字段“name”将在表单中具有值“bar”


这是经过测试的hack

我刚刚发现ModelAdmin.add\u视图使用request.GET在django/contrib/admin/options.py行900中设置initial

所以,要用“bar”预填充someapp.somemodel添加表单的“name”字段,只需打开:/admin/someapp/somemodel/add/?name=bar即可

现在,如果希望在更改表单中有类似的行为,请重写get_object方法,如下所示:

def get_object(self, request, object_id):
    obj = super(YourModelAdmin, self).get_object(request, object_id)
    for key, value in request.GET.items():
        setattr(obj, key, value)
    return obj
现在打开/admin/someapp/somemodel/1/?name=bar,字段“name”将在表单中具有值“bar”


这是经过测试的hack

,但我发现:这些值仅显示在未绑定表单中。我的更改表单已绑定。您可以说“在添加表单中预填充字段”。添加表单是不受约束的,这是肯定的。“好像它是可能的…在添加表单中”尽管如此,感谢您的努力!我明白了,FormView(其中get_form()返回一个表单实例,get_form_class()返回一个表单类)和ModelAdmin.get_form返回一个表单类之间有点不一致。因此,这里唯一的解决方案似乎是覆盖add_view()并重新执行request.POST。我不明白您到底想要什么。努力把问题弄清楚,放上代码示例,期望的行为等等……但我明白了:这些值只显示在未绑定的表单上。我的更改表单已绑定。您可以说“在添加表单中预填充字段”。添加表单是不受约束的,这是肯定的。“好像它是可能的…在添加表单中”尽管如此,感谢您的努力!我明白了,FormView(其中get_form()返回一个表单实例,get_form_class()返回一个表单类)和ModelAdmin.get_form返回一个表单类之间有点不一致。因此,这里唯一的解决方案似乎是覆盖add_view()并重新执行request.POST。我不明白您到底想要什么。努力让你的问题变得清晰,给出代码示例,期望的行为等等。。。