如何在Django表单集显示隐藏的自动字段
在Django中,当使用表单集合(formset)显示自动字段(autofield)时,它默认是隐藏的。那么,怎样才能把它显示出来呢?
目前,这个模型是这样定义的,
class MyModel:
locid = models.AutoField(primary_key=True)
...
当使用Django的表单集合渲染时,
class MyModelForm(ModelForm):
class Meta:
model = MyModel
fields = ('locid', 'name')
它在页面上显示为,
<input id="id_form-0-locid" type="hidden" value="707" name="form-0-locid"/>
谢谢。
编辑
我这样创建表单集合 -
LocFormSet = modelformset_factory(MyModel)
pformset = LocFormSet(request.POST, request.FILES, queryset=MyModel.objects.order_by('name'))
第二次编辑
看起来我没有使用我定义的自定义表单类,所以问题需要稍微修改一下。
我该如何从一个自定义表单创建表单集合(这个表单会显示一个隐藏字段),同时使用一个自定义查询集?
目前,我可以选择从BaseModelFormSet类继承并使用自定义查询集,或者使用ModelForm类在一个表单中添加一个自定义字段。有没有办法在表单集合中同时做到这两点?
第三次编辑
我现在使用的是,
class MyModelForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
locid = forms.IntegerField(min_value = 1, required=True)
self.fields['locid'].widget.attrs["type"] = 'visible'
self.queryset = MyModel.objects.order_by('name')
class Meta:
model = MyModel
fields = ('locid', 'name')
LocFormSet = modelformset_factory(MyModel, form = MyModelForm)
pformset = LocFormSet()
但是这仍然没有
- 显示locid
- 使用指定的自定义查询。
4 个回答
正如你所说,你并没有使用你定义的自定义表单。这是因为你没有把它传递到任何地方,所以Django无法识别它。
解决方法很简单——只需将自定义表单类传递给modelformset_factory就可以了:
LocFormSet = modelformset_factory(MyModel, form=MyModelForm)
编辑:针对更新3的回复:
首先,你对locid的重新定义放错地方了——它应该在类的层级上,而不是放在__init__
里面。
其次,把查询集放在form里面是没有用的——表单并不知道查询集是什么。你应该回到之前的做法,在实例化表单集时将它作为参数传入。(另外,你也可以定义一个自定义的formset,但那样做似乎有点过于复杂。)
class MyModelForm(ModelForm):
locid = forms.IntegerField(min_value=1, required=True)
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['locid'].widget.attrs["type"] = 'visible'
class Meta:
model = MyModel
fields = ('locid', 'name')
LocFormSet = modelformset_factory(MyModel, form = MyModelForm)
pformset = LocFormSet(request.POST, request.FILES,
queryset=MyModel.objects.order_by('name')))
试着改变默认的字段类型:
from django import forms
class MyModelForm(ModelForm):
locid = forms.IntegerField(min_value=1, required=True)
class Meta:
model = MyModel
fields = ('locid', 'name')
编辑:已经测试过了,确实有效...
好吧,上面提到的方法对我都没用。最后,我从模板那边解决了这个问题。
有一个问题单被提交了(http://code.djangoproject.com/ticket/10427),它为表单的模板变量添加了一个“值”选项。比如,它允许你这样显示:
{{form.locid.value}}
这个功能可以通过补丁来实现,可以在django的SVN版本中使用“patch -p0 file.patch”来安装。
记住,{{form.locid.value}}这个变量需要和看不见的表单一起使用——否则,表单的提交和保存操作会出错。
这和{{form.locid.data}}是不一样的——这一点在上面提到的问题单中有解释。