在Django中创建自定义模型管理内联时,您可以设置两个参数extra
和max_num
:要显示的其他表单的数量,以及允许用户附加到的最大对象数父对象。
我有一个问题模型,每个模型都有几个答案,这些答案在问题管理员中是内联的。大多数问题都有三个答案,所以我想默认显示三个内联;然而,当编辑一个已经有三个答案的问题时,它看起来很拥挤和俗气,以显示三个完整的额外字段,而最有可能根本就没有更多的答案。我想要的基本上是一个min_num
参数:我想默认显示至少三个字段,如果已经有少于三个答案,则为空,同时仍然允许用户添加更多,然后全部显示
我已经找到了将其添加到formsets和inlines的门票,但看起来它们尚未解决。目前在Django 1.4中有没有方便的方法呢?
答案 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)
答案 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行添加和更改表单。