gpt4 book ai didi

django - 当还给出实例时如何为 ModelForm 设置初始值

转载 作者:行者123 更新时间:2023-12-03 15:08:26 25 4
gpt4 key购买 nike

似乎如果给一个 ModelForm 一个实例,它会忽略您为 initial 提供的任何值。而是将它设置为实例的值——即使该实例是一个空的模型记录。

有没有办法用实例创建一个表单并让它设置初始数据?

我需要它,因为我正在保存相关记录并且它们似乎没有正确保存,除非在创建 ModelForm 时提供了一个实例。

我相信这个问题的答案很简单,我只是遗漏了一些明显的东西。

这是相关的代码:

在 View 中:

form = form_class(person=person, conference=conference, initial=initial, instance=registration)

其中 form_class 是 RegistrationForm然后在注册表中:
class RegisterForm(forms.ModelForm):
... fields here ...

def __init__(self, *args, **kwargs):
... other code ...
self.person = kwargs.pop('person')
super(RegisterForm, self).__init__(*args, **kwargs)
for key, in self.fields.keys():
if hasattr(self.person, key):
self.fields[k].initial = getattr(self.person, key)

然后当我调用该字段时,相关字段为空。

最佳答案

经过一点谷歌搜索后弄清楚了这一点。

您必须在调用 super 之前设置初始值 .

所以不要循环遍历 self.fields.keys() ,我不得不输入我想要的字段列表并循环遍历它:

class RegisterForm(forms.ModelForm):
... fields here ...
initial_fields = ['first_name', 'last_name', ... ]

def __init__(self, *args, **kwargs):
... other code ...
self.person = kwargs.pop('person')
for key in self.initial_fields:
if hasattr(self.person, key):
self.fields[k].initial = getattr(self.person, key)
super(RegisterForm, self).__init__(*args, **kwargs)

@Daria 正确地指出您没有 self.fields在调用 super 之前。我很确定这会起作用:
class RegisterForm(forms.ModelForm):
... fields here ...
initial_fields = ['first_name', 'last_name', ... ]

def __init__(self, *args, **kwargs):
... other code ...
initial = kwargs.pop('initial', {})
self.person = kwargs.pop('person')
for key in self.initial_fields:
if hasattr(self.person, key):
initial[key] = initial.get(key) or getattr(self.person, key)
kwargs['initial'] = initial
super(RegisterForm, self).__init__(*args, **kwargs)

在这个版本中,我们使用 initial传入值的参数。它还被写入,以便如果我们已经在该字段的初始值中有一个值,我们不会覆盖它。

关于django - 当还给出实例时如何为 ModelForm 设置初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18254401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com