【问题标题】:Django admin inlines - minimum number of formsDjango admin inlines - 最少表单数
【发布时间】:2012-09-23 11:48:26
【问题描述】:

在 Django 中创建自定义模型管理内联时,您可以设置两个参数 extramax_num:要显示的附加表单数,以及允许用户附加到父对象的最大对象数。

我有一个 Question 模型,每个模型都可以有多个答案,这些答案在 Question admin 中是内联的。大多数问题都会有三个答案,所以我想默认显示三个内联;然而,当编辑一个已经有三个答案的问题时,在很可能根本没有更多答案的情况下,显示三个完整的额外字段看起来很拥挤和俗气。我想要的本质上是一个min_num 参数:默认情况下我想显示至少三个字段,如果已经少于三个答案则为空,同时仍然允许用户添加比将显示的更多的字段。

我找到了将其添加到 formsetsinlines 的票证,但似乎还没有解决。目前在 Django 1.4 中是否有任何便捷的方法可以做到这一点?

【问题讨论】:

    标签: django django-admin formset inline-formset


    【解决方案1】:

    我最终使用了一个动态的extra 值:

    class AnswerInline(admin.TabularInline):
        model = Answer
        initial_num = 3
    
        def get_extra(self, request, obj=None, **kwargs):
            if obj is not None:
                return max(self.initial_num - obj.answers.count(), 1)
            return self.initial_num
    

    这样可以确保有 3 个表单,或者比填充表单的数量多一个,并且不会遇到 min_num 的验证问题。

    【讨论】:

      【解决方案2】:

      我必须设置 extra 和 min_num 才能工作

      class MyInline(admin.TabularInline):
          extra = 0
          min_num = 3
      

      【讨论】:

      • 当我这样做时,每个空表单集的每个字段都会出现“此字段是必需的”错误。就我而言,我想显示 3 个表格,但需要 0 个。
      【解决方案3】:

      将 max_num 设置为 3 并额外添加注释,这样您在添加和更改表单中将始终有 3 行。

      【讨论】:

      • 问题似乎没有指定 3 是最大值,只是通常。
      【解决方案4】:

      有一个可用的补丁:

      https://code.djangoproject.com/ticket/17642

      【讨论】:

      • 看起来它已经被合并了,现在可以在 Django 1.7 中使用了! \o/
      【解决方案5】:

      我不确定。但在我的项目中,我这样做了。 填写表格的计数 = 计数(未删除现有)+ 计数(已更改且未删除新的)。在干净的方法中,我们确保所有表单都已经过验证(并且不包含空白表单)。

      forms.py:

      class AnswersFormsetBase(forms.models.BaseInlineFormSet):
          def clean(self):
              super(AnswersFormsetBase, self).clean()
      
              initial_num = len(filter(lambda f: not self._should_delete_form(f), self.initial_forms))
              extra_num = len(filter(lambda f: f.has_changed() and not self._should_delete_form(f), self.extra_forms))
              if initial_num + extra_num < 2:
                  raise ValidationError("Polling should be at least two possible answers")
      
      AnswerFormset = inlineformset_factory(Polling, Answer, formset=AnswersFormsetBase)
      

      admin.py:

      class AnswersInline(admin.TabularInline):
          model = Answer
          fk_name = "polling"
          formset = AnswerFormset # from forms.py
      
      class PollingModelAdmin(admin.ModelAdmin):
          inlines = [AnswersInline]
      
      admin.site.register(Polling, PollingModelAdmin)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-16
        • 2014-02-15
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多