Django管理员内联 - 最少的表格数量

时间:2012-10-02 15:30:07

标签: django django-admin formset inline-formset

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

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

我已经找到了将其添加到formsetsinlines的门票,但看起来它们尚未解决。目前在Django 1.4中有没有方便的方法呢?

5 个答案:

答案 0 :(得分:3)

我必须为此工作设置额外和min_num

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

答案 1 :(得分:1)

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

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)

答案 2 :(得分:1)

有一个可用的补丁:

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

答案 3 :(得分:0)

我最终使用了动态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的验证问题。

答案 4 :(得分:-1)

将max_num设置为3并注释额外,这样你将总是有3行添加和更改表单。