8

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

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

我找到了将其添加到formsetinlines的票证,但看起来它们还没有解决。目前在 Django 1.4 中是否有任何方便的方法可以做到这一点?

4

5 回答 5

10

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

class MyInline(admin.TabularInline):
    extra = 0
    min_num = 3
于 2018-01-07T04:31:26.220 回答
2

有一个可用的补丁:

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

于 2012-12-27T22:23:26.977 回答
2

我最终使用了一个动态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

于 2018-02-27T04:49:50.457 回答
1

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

表格.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)

管理员.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)
于 2012-11-27T17:24:25.557 回答
-1

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

于 2014-07-10T07:06:26.523 回答