【问题标题】:Creating modelformset from a modelform从模型表单创建模型表单集
【发布时间】:2010-10-28 03:58:53
【问题描述】:

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

我想以此构建一个模型表单集,但有一些注意事项:

  • 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

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

【问题讨论】:

    标签: python django formset modelform


    【解决方案1】:

    向用户显示自动字段是没有意义的,因为它是一个自动递增的主键——用户无法更改它,并且在将记录保存到数据库之前它将不可用(DBMS 选择下一个可用的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)
    

    【讨论】:

    • 嗯,这个表单的需要是我希望能够至少向用户显示 locid(即使它被隐藏并且无法修改)。您认为最好的方法是什么?
    【解决方案2】:

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

    How to show hidden autofield in django formset

    【讨论】:

      【解决方案3】:

      如果您喜欢便宜的解决方法,为什么不将locid 混入__unicode__ 方法中呢?保证用户可以看到,不需要 django-admin 的特殊知识。

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

      【讨论】:

      • 实际上,这与 django-admin 界面无关——我假设您指的是服务器,而不是库?
      猜你喜欢
      • 2012-08-13
      • 2020-07-18
      • 2012-06-29
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      相关资源
      最近更新 更多