1

我正在制作一个设置界面,它通过扫描已安装应用程序中的设置文件夹、扫描设置文件、最后扫描 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))

“用户”对象不支持索引

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

4

2 回答 2

3

我不确定我是否理解您想要做什么 - 如果您只对单个表单感兴趣,我不知道您为什么要参与表单集。

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

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

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

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

于 2012-07-15T17:47:14.120 回答
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/

丹尼尔的方法也是有效和干净的......根据您不同的 ids/types 等,您可以使用不同的 Form 对象

表格.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')

视图.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()
于 2012-07-15T18:09:59.143 回答