django:使用queryset作为modelform初始数据

django:使用queryset作为modelform初始数据,django,Django,我正在制作一个设置界面,通过扫描安装的应用程序中的设置文件夹,扫描设置文件,最后扫描模型表单来工作 我已经走到了最后一步。表单已正确找到并加载,但我现在需要提供初始数据。初始数据将从数据库中提取,并且,正如您可以想象的那样,它必须限于经过身份验证的用户(通过request.user.id) 请记住,这些都是动态完成的。任何东西的名称都不存在,它们的结构在advanced中也不为人所知(我真的不想维护一个无聊的设置界面) 下面是一个示例设置表单。我只选择模型和用户可以编辑的字段(这是我希望维护设置

我正在制作一个设置界面,通过扫描安装的应用程序中的设置文件夹,扫描设置文件,最后扫描模型表单来工作

我已经走到了最后一步。表单已正确找到并加载,但我现在需要提供初始数据。初始数据将从数据库中提取,并且,正如您可以想象的那样,它必须限于经过身份验证的用户(通过request.user.id)

请记住,这些都是动态完成的。任何东西的名称都不存在,它们的结构在advanced中也不为人所知(我真的不想维护一个无聊的设置界面)

下面是一个示例设置表单。我只选择模型和用户可以编辑的字段(这是我希望维护设置界面的范围)

我已经看过modelformset_工厂,它几乎完成了我想要做的事情,但它似乎只处理两个或更多的结果。(此处,obj是设置表单之一)

我不能过滤数据,我必须得到一个,而且只有一个结果。不幸的是,我不能使用get()

“User”对象没有“ordered”属性

提供查询结果作为初始数据也不起作用,因为它不是列表

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()