0

我有一个模型 MyModel,它包含一个 PK - locid,即一个 AutoField。

我想从中构建一个模型表单集,但有一些注意事项:

  • 表单集的查询集应该是自定义的(比如 order_by('field'))而不是 all()
  • 由于 MyModel 的 locid 是一个 AutoField,因此默认情况下是隐藏的,因此我希望能够将其显示给用户。

我不知道该怎么做。我尝试了多种方法,

MyModelFormSet = modelformset_factory(MyModel, fields=('locid', 'name', 'dupof'))

上面给了我 3 个字段,但是 locid 是隐藏的。

class MyModelForm(ModelForm):

  def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    self.fields['locid'].widget.attrs["type"] = 'visible'
    locid = forms.IntegerField(min_value = 1, required=True)

  class Meta:
    model = MyModel
    fields = ('locid', 'name', 'dupof')

以上给了我一个ManyToMany错误。

有没有人做过这样的事情?


编辑2

我现在可以在实例化表单集时使用自定义查询 - 但我仍然需要向用户显示 locid 字段,因为 id 对于应用程序的使用很重要。我该怎么做?如果它是自动字段,有没有办法覆盖隐藏 PK 的默认行为?

4

3 回答 3

2

向用户显示自动字段是没有意义的,因为它是一个自动递增的主键——用户无法更改它,并且在将记录保存到数据库之前它将不可用(DBMS 选择下一个可用的 id)。

这是为表单集设置自定义查询集的方式:

from django.forms.models import BaseModelFormSet

class OrderedFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        self.queryset = MyModel.objects.order_by("field")
        super(OrderedFormSet, self).__init__(*args, **kwargs)

然后在工厂函数中使用该表单集:

MyModelFormSet = modelformset_factory(MyModel, formset=OrderedFormSet)
于 2009-05-22T11:16:38.687 回答
1

正如我在这里提到的,我最终使用了模板端变量来执行此操作:

如何在 django formset 中显示隐藏的自动字段

于 2009-05-26T21:35:34.087 回答
0

如果您喜欢便宜的解决方法,为什么不将其locid融入该__unicode__方法呢?保证用户可以看到,不需要 django-admin 的特殊知识。

但是,公平地说,我对 django-admin 相关问题的所有回答都倾向于“不要费力地使 django-admin 成为一个通用的 CRUD 界面”。

于 2009-05-24T01:38:21.063 回答