我正在创建一个设置界面,该界面的工作原理是扫描已安装应用程序中的设置文件夹,扫描设置文件,最后扫描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))
'用户'对象不支持索引
我有一种感觉,答案就在我面前。如何从数据库中提取数据库并将其作为初始值推送到表单中?
答案 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是一个元组。
有关动态表单的更多信息:
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()