如何在Django表单集显示隐藏的自动字段

2 投票
4 回答
5666 浏览
提问于 2025-04-15 11:46

在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 个回答

1

正如你所说,你并没有使用你定义的自定义表单。这是因为你没有把它传递到任何地方,所以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')))
2

试着改变默认的字段类型:

from django import forms
class MyModelForm(ModelForm):
  locid = forms.IntegerField(min_value=1, required=True)
  class Meta:
    model = MyModel
    fields = ('locid', 'name')

编辑:已经测试过了,确实有效...

0

好吧,上面提到的方法对我都没用。最后,我从模板那边解决了这个问题。

这个功能可以通过补丁来实现,可以在django的SVN版本中使用“patch -p0 file.patch”来安装。

  • 记住,{{form.locid.value}}这个变量需要和看不见的表单一起使用——否则,表单的提交和保存操作会出错。

  • 这和{{form.locid.data}}是不一样的——这一点在上面提到的问题单中有解释。

撰写回答