从modelform创建modelformset

时间:2009-05-22 08:22:13

标签: python django formset modelform

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

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

  • formset的查询集应该是自定义的(例如,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

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

3 个答案:

答案 0 :(得分:2)

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

这是为formset设置自定义查询集的方法:

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)

然后在工厂函数中使用该formset:

MyModelFormSet = modelformset_factory(MyModel, formset=OrderedFormSet)

答案 1 :(得分:1)

我最终使用模板边变量来执行此操作,正如我在此处提到的那样:

How to show hidden autofield in django formset

答案 2 :(得分:0)

如果您喜欢廉价的解决方法,为什么不将locid变成__unicode__方法呢?用户可以保证看到它,并且不需要django-admin的特殊知识。

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

相关问题