从模型表单创建模型表单集

0 投票
3 回答
2508 浏览
提问于 2025-04-15 11:46

我有一个模型叫做 MyModel,它里面有一个主键 locid,这个主键是自动生成的。

我想从这个模型创建一个表单集合,但有几点要求:

  • 这个表单集合的数据查询需要是自定义的,比如按照某个字段排序,而不是直接获取所有数据。
  • 因为 MyModel 的 locid 是自动生成的,所以默认是隐藏的,我希望能把它显示给用户。

我不太确定该怎么做。我尝试了好几种方法,

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

上面的代码让我得到了三个字段,但 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')

上面的代码让我遇到了一个多对多的错误。

有没有人之前做过类似的事情?


编辑 2

现在我在创建表单集合的时候可以使用自定义查询了,但我仍然需要把 locid 字段显示给用户,因为这个 ID 对于应用程序的使用很重要。我该怎么做呢?有没有办法覆盖默认的隐藏主键的行为,特别是当它是自动生成的字段时?

3 个回答

0

如果你喜欢便宜的解决办法,为什么不把 locid 直接搞进 __unicode__ 方法里呢?这样用户肯定能看到,而且用到 django-admin 的时候也不需要特别的知识。

不过,公平地说,我对 django-admin 相关问题的回答大多都是“别太费劲地把 django-admin 弄成一个万能的 CRUD 界面”。

2

给用户显示一个自动生成的字段是没有意义的,因为它是一个自增的主键——用户无法更改它,而且在将记录保存到数据库之前,这个字段是不可用的(数据库管理系统会选择下一个可用的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)
1

我最后使用了一个模板侧的变量来实现这个功能,就像我在这里提到的:

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

撰写回答