Python 如何在django表单集中显示隐藏的自动字段
默认情况下,使用表单集显示的Django自动字段是隐藏的。最好的展示方式是什么 目前,该模型被声明为Python 如何在django表单集中显示隐藏的自动字段,python,django,formset,Python,Django,Formset,默认情况下,使用表单集显示的Django自动字段是隐藏的。最好的展示方式是什么 目前,该模型被声明为 class MyModel: locid = models.AutoField(primary_key=True) ... 使用Django Formset呈现时 class MyModelForm(ModelForm): class Meta: model = MyModel fields = ('locid', 'name') 它在页面上显示为 <i
class MyModel:
locid = models.AutoField(primary_key=True)
...
使用Django Formset呈现时
class MyModelForm(ModelForm):
class Meta:
model = MyModel
fields = ('locid', 'name')
它在页面上显示为
<input id="id_form-0-locid" type="hidden" value="707" name="form-0-locid"/>
第二次编辑 看起来我没有使用我在那里定义的自定义表单类,所以这个问题需要稍微修改 如何从自定义表单(将显示隐藏字段)创建表单集,以及如何使用自定义查询集 目前,我可以从BaseModelFormSet类继承并使用自定义查询集,也可以使用ModelForm类向表单添加自定义字段。有没有一种方法可以同时使用表单集
第三次编辑 我现在用
class MyModelForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
locid = forms.IntegerField(min_value = 1, required=True)
self.fields['locid'].widget.attrs["type"] = 'visible'
self.queryset = MyModel.objects.order_by('name')
class Meta:
model = MyModel
fields = ('locid', 'name')
LocFormSet = modelformset_factory(MyModel, form = MyModelForm)
pformset = LocFormSet()
但这仍然不起作用
- 显示locid
- 使用指定的自定义查询
from django import forms
class MyModelForm(ModelForm):
locid = forms.IntegerField(min_value=1, required=True)
class Meta:
model = MyModel
fields = ('locid', 'name')
编辑:已测试且有效…正如您所说,您没有使用您定义的自定义表单。这是因为你没有在任何地方传递它,所以Django不可能知道它 解决方案很简单-只需将自定义表单类传递到modelformset_工厂:
LocFormSet = modelformset_factory(MyModel, form=MyModelForm)
LocFormSet = modelformset_factory(MyModel,
formset=VisiblePrimaryKeyFormSet)
编辑以响应更新3:
首先,您在错误的位置重新定义了locid-它需要在类级别,而不是在\uuuuu init\uuuu
中
其次,将查询集放在表单中根本没有任何作用-表单不知道查询集。您应该回到之前所做的工作,在实例化表单集时将其作为参数传入。(或者,您可以定义自定义表单集,但这似乎有些过分。)
好吧,以上方法对我都不管用。我最终从模板方面解决了这个问题
- 有一个ticket字段(),它为表单的模板变量添加了一个“value”选项。比如说它允许, {{form.locid.value}
- 请记住,{form.locid.value}变量将与不可见表单一起使用,否则,表单集的提交和保存操作将崩溃
- 这与{{form.locid.data}不同——正如上面提到的票证中所解释的那样
LocFormSet = modelformset_factory(MyModel, form=MyModelForm)
LocFormSet = modelformset_factory(MyModel,
formset=VisiblePrimaryKeyFormSet)
这在formset类中:
from django.forms.models import BaseInlineFormSet, BaseModelFormSet, IntegerField
from django.forms.formsets import BaseFormSet
class VisiblePrimaryKeyFormset(BaseModelFormSet):
def add_fields(self, form, index):
self._pk_field = pk = self.model._meta.pk
if form.is_bound:
pk_value = form.instance.pk
else:
try:
pk_value = self.get_queryset()[index].pk
except IndexError:
pk_value = None
form.fields[self._pk_field.name] = IntegerField( initial=pk_value,
required=True) #or any other field you would like to display the pk in
BaseFormSet.add_fields(self, form, index) # call baseformset which does not modify your primary key field
谢谢你的回复。不幸的是,这似乎并没有改变页面上显示的内容。您重新启动服务器了吗?根据您的环境设置方式,您可能必须这样做。我刚刚用我自己的模型测试了上面的内容,但效果很好。嗯,通常我的更改不需要重新启动就可以显示出来(例如,添加新字段等)——我有一个apache/mod_python设置,可以在每次请求时刷新。也许有一种方法我们可以创建不同的表单集?我使用类似于LocFormSet=modelformset_factory(MyModel)pformset=LocFormSet(request.POST,request.FILES,queryset=MyModel.objects.order_by('name'))的东西,我不知道该告诉你什么,“它在我的机器上工作”:P到底发生了什么?它只是一直显示一个隐藏字段?谢谢你在表单=。。我不知道我怎么会在文件里漏掉这个!我仍然坚持我原来的问题,虽然-编辑问题3号说明了当前的代码。关于如何实现这一点有什么想法吗?正如Daniel所说,您仍然需要将locid声明移到init方法之外。谢谢-queryset现在可以工作了,但我仍然无法看到locid!正如上面所说的那样声明它-locid是类而不是init的一部分-我在其中也有self.fields-不会以locid可见而告终。