django:使用queryset作为modelform初始数据
我正在制作一个设置界面,通过扫描安装的应用程序中的设置文件夹,扫描设置文件,最后扫描模型表单来工作 我已经走到了最后一步。表单已正确找到并加载,但我现在需要提供初始数据。初始数据将从数据库中提取,并且,正如您可以想象的那样,它必须限于经过身份验证的用户(通过request.user.id) 请记住,这些都是动态完成的。任何东西的名称都不存在,它们的结构在advanced中也不为人所知(我真的不想维护一个无聊的设置界面) 下面是一个示例设置表单。我只选择模型和用户可以编辑的字段(这是我希望维护设置界面的范围) 我已经看过modelformset_工厂,它几乎完成了我想要做的事情,但它似乎只处理两个或更多的结果。(此处,obj是设置表单之一) 我不能过滤数据,我必须得到一个,而且只有一个结果。不幸的是,我不能使用get() “User”对象没有“ordered”属性 提供查询结果作为初始数据也不起作用,因为它不是列表django:使用queryset作为modelform初始数据,django,Django,我正在制作一个设置界面,通过扫描安装的应用程序中的设置文件夹,扫描设置文件,最后扫描模型表单来工作 我已经走到了最后一步。表单已正确找到并加载,但我现在需要提供初始数据。初始数据将从数据库中提取,并且,正如您可以想象的那样,它必须限于经过身份验证的用户(通过request.user.id) 请记住,这些都是动态完成的。任何东西的名称都不存在,它们的结构在advanced中也不为人所知(我真的不想维护一个无聊的设置界面) 下面是一个示例设置表单。我只选择模型和用户可以编辑的字段(这是我希望维护设置
Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(initial=obj.Meta.model.objects.get(id=request.user.id))
“用户”对象不支持索引
我觉得答案就在眼前。如何从数据库中提取数据库并将其作为初始值推入表单中?我不太清楚您想做什么-如果您只对一个表单感兴趣,我不知道您为什么要参与表单集 要使用数据库中的初始数据填充modelform,只需传递实例参数:
my_form = Set_Personal_Info(instance=UserProfile.objects.get(id=request.user.id))
在POST上实例化表单时,不要忘记传递instance参数,这样Django就会更新现有实例,而不是创建新实例
(请注意,您可能需要考虑为对象提供更好的名称。
obj
通常描述一个模型实例,而不是一个表单,form
将是一个更好的名称。表单类应该遵循PEP8,并且可能包含单词“form”-因此PersonalInfoForm
将是一个好名称。)根据我的理解。。。如果要生成具有动态字段的表单,可以使用以下方法:
类MyModelForm(forms.ModelForm):
其中,动态_字段是一个元组
有关动态表单的更多信息:
Daniel的方法也是有效和干净的。。。根据您的不同ID/类型等,您可以使用不同的表单对象
forms.py
类MyModelFormA(forms.ModelForm):
views.py
如果request.method==“POST”:
if id == 1:
form = MyModelFormA(data=request.POST)
elif id == 2:
form = MyModelFormB(data=request.POST)
else:
form = MyModelFormN(data=request.POST)
if form.is_valid():
form.save() else:
if id == 1:
form = MyModelFormA()
elif id == 2:
form = MyModelFormB()
else:
form = MyModelFormN()
Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(initial=obj.Meta.model.objects.get(id=request.user.id))
my_form = Set_Personal_Info(instance=UserProfile.objects.get(id=request.user.id))
def __init__(self, dynamic_fields, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields = fields_for_model(self._meta.model, dynamic_fields, self._meta.exclude, self._meta.widgets)
class Meta:
model = MyModel
class Meta:
model = MyModel
fields = ('field_a','field_b','field_c')
class MyModelFormB(forms.ModelForm):
class Meta:
model = MyModel
fields = ('field_d','field_e','field_f')
if id == 1:
form = MyModelFormA(data=request.POST)
elif id == 2:
form = MyModelFormB(data=request.POST)
else:
form = MyModelFormN(data=request.POST)
if form.is_valid():
form.save() else:
if id == 1:
form = MyModelFormA()
elif id == 2:
form = MyModelFormB()
else:
form = MyModelFormN()