Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django表单集中显示隐藏的自动字段_Python_Django_Formset - Fatal编程技术网

Python 如何在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

默认情况下,使用表单集显示的Django自动字段是隐藏的。最好的展示方式是什么

目前,该模型被声明为

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}

待展示。这是一个补丁,可以使用“patch-p0 file.patch”安装在django的SVN版本中

  • 请记住,{form.locid.value}变量将与不可见表单一起使用,否则,表单集的提交和保存操作将崩溃

  • 这与{{form.locid.data}不同——正如上面提到的票证中所解释的那样


自动字段隐藏的原因是BaseModelFormSet和BaseInlineFormSet都会覆盖add_字段中的该字段。解决方法是创建自己的表单集并覆盖add_字段,而不调用super。此外,您不必显式定义主键

您必须将表单集传递给modelformset\u工厂:

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可见而告终。