Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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
Django管理内联-表单的最小数量_Django_Django Admin_Formset_Inline Formset - Fatal编程技术网

Django管理内联-表单的最小数量

Django管理内联-表单的最小数量,django,django-admin,formset,inline-formset,Django,Django Admin,Formset,Inline Formset,在Django中创建自定义模型管理内联线时,可以设置两个参数extra和max_num:要显示的其他表单的数量,以及允许用户附加到父对象的最大对象数 我有一个问题模型,每个模型都可以有几个答案,这些答案是问题管理中的内联线。大多数问题都有三个答案,所以我想默认显示三条内联线;然而,当编辑一个已经有三个答案的问题时,在很可能根本就没有答案的情况下,显示三个额外的字段看起来既拥挤又俗气。我想要的基本上是一个min_num参数:我希望在默认情况下至少显示三个字段,如果已经有少于三个答案,则为空,同时仍

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

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


我已经找到了将此添加到和的罚单,但它们似乎尚未解决。目前在Django 1.4中有什么方便的方法可以做到这一点吗?

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

forms.py:


有一个修补程序可用于此:


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

我必须设置extra和min_num以使其生效

类MyInline(管理列表行):
额外=0
最小数量=3

我最后使用了一个动态
额外的
值:

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
已经存在的验证问题。

看起来它已经被合并,现在在Django 1.7中可用<代码>\o/问题似乎没有指定3是最大值,只是通常的情况。当我这样做时,每个空表单集的每个字段上都会出现“this field is required”错误。在我的例子中,我想显示3个表单,但需要0。
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)
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