从模型表单创建模型表单集
我有一个模型叫做 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
我最后使用了一个模板侧的变量来实现这个功能,就像我在这里提到的: