django:使用查询集作为模型初始数据

时间:2012-07-15 13:54:10

标签: django

我正在创建一个设置界面,该界面的工作原理是扫描已安装应用程序中的设置文件夹,扫描设置文件,最后扫描ModelForms。

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

请记住,这一切都是动态完成的。在高级中没有任何名称,也没有其结构(我真的不想保持枯燥的设置界面)。

以下是一个示例设置表单。我只选择模型以及用户可以编辑的字段(这是我想要维护设置界面的程度)。

class Set_Personal_Info(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('nick_name', 'url')

我看过modelformset_factory,几乎做我想做的事情,但它似乎只能处理两个或更多的结果。 (此处, obj 是设置表单之一)

Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(queryset=obj.Meta.model.objects.filter(id=request.user.id))

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

Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(queryset=obj.Meta.model.objects.get(id=request.user.id))
  

'用户'对象没有'有序'属性

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

Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(initial=obj.Meta.model.objects.get(id=request.user.id))
  

'用户'对象不支持索引

我有一种感觉,答案就在我面前。如何从数据库中提取数据库并将其作为初始值推送到表单中?

2 个答案:

答案 0 :(得分:3)

我不太确定我明白你要做什么 - 如果你只对一个表单感兴趣,我不知道你为什么要参与表格集。

要使用数据库中的初始数据填充模型,只需传递实例参数:

my_form = Set_Personal_Info(instance=UserProfile.objects.get(id=request.user.id))

当您在POST上实例化表单时,不要忘记也传递实例参数,以便Django更新现有实例而不是创建新实例。

(注意,您可能需要考虑为对象提供更好的名称。obj通常描述一个模型实例,而不是一个表单,form将是一个更好的名称。应遵循PEP8,并且可能包含“形式”一词 - 因此PersonalInfoForm将是一个好名字。)

答案 1 :(得分:0)

根据我的理解...如果你想生成一个包含动态字段的表单,你可以使用它:

  

类MyModelForm(forms.ModelForm):

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

其中dynamic_fields是一个元组。

有关动态表单的更多信息:

  1. http://www.rossp.org/blog/2008/dec/15/modelforms/
  2. http://jacobian.org/writing/dynamic-form-generation/
  3. http://dougalmatthews.com/articles/2009/dec/16/nicer-dynamic-forms-django/
  4. Daniel的方法也是有效且干净的...根据您的不同ID /类型等,您可以使用不同的Form对象

    forms.py

      

    类MyModelFormA(forms.ModelForm):

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

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