2

默认情况下,使用表单集显示的 Django 自动字段是隐藏的。展示它的最佳方式是什么?

目前,模型被声明为,

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

4 回答 4

2

尝试更改默认字段类型:

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

编辑:经过测试和工作......

于 2009-05-22T02:34:17.333 回答
1

正如您所说,您没有使用您定义的自定义表单。这是因为你没有在任何地方传递它,所以 Django 无法知道它。

解决方案很简单 - 只需将自定义表单类传递给 modelformset_factory:

LocFormSet = modelformset_factory(MyModel, form=MyModelForm) 

编辑以响应更新 3:

首先,你在错误的地方重新定义了 locid - 它需要在类级别,而不是在__init__.

其次,将查询集放在表单中根本不会做任何事情——表单不知道查询集。您应该回到之前所做的事情,在实例化表单集时将其作为参数传递。(或者,您可以定义一个自定义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')))
于 2009-05-22T08:59:29.277 回答
0

好的,以上方法都不适合我。最后,我从模板方面解决了这个问题。

要显示。这是一个补丁,可以使用“patch -p0 file.patch”安装在 django 的 SVN 版本中

  • 请记住,{{form.locid.value}} 变量将与不可见的表单一起使用 - 否则,表单集的提交和保存操作将崩溃。

  • 这与 {{ form.locid.data }} 不同 - 正如上面提到的票证中所解释的那样。

于 2009-05-24T01:25:51.293 回答
0

隐藏自动字段的原因是 BaseModelFormSet 和 BaseInlineFormSet 都覆盖了 add_field 中的该字段。修复它的方法是创建自己的表单集并覆盖 add_field 而不调用 super。此外,您不必显式定义主键。

您必须将表单集传递给 modelformset_factory:

    LocFormSet = modelformset_factory(MyModel, 
           formset=VisiblePrimaryKeyFormSet)

这是在表单集类中:

from django.forms.models import BaseInlineFormSet, BaseModelFormSet, IntegerField
from django.forms.formsets import BaseFormSet

class VisiblePrimaryKeyFormset(BaseModelFormSet):
    def add_fields(self, form, index):
        self._pk_field = pk = self.model._meta.pk
        if form.is_bound:
            pk_value = form.instance.pk
        else:
            try:
                pk_value = self.get_queryset()[index].pk
            except IndexError:
                pk_value = None
        form.fields[self._pk_field.name] = IntegerField( initial=pk_value,
                 required=True) #or any other field you would like to display the pk in
        BaseFormSet.add_fields(self, form, index) # call baseformset which does not modify your primary key field
于 2009-08-12T14:51:02.770 回答