我有一个模型MyModel,它包含一个PK-locid,即一个AutoField。
我想从中构建一个模型formset,但有一些注意事项:
我不知道该怎么做。我尝试了多种方法,
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的默认行为?如果它是自动对象?
答案 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)
我最终使用模板边变量来执行此操作,正如我在此处提到的那样:
答案 2 :(得分:0)
如果您喜欢廉价的解决方法,为什么不将locid
变成__unicode__
方法呢?用户可以保证看到它,并且不需要django-admin的特殊知识。
但是,公平地说,我对django-admin相关问题的所有答案都倾向于“不要努力使django-admin成为一个通用的CRUD界面”。