如果引发ValidationError,则Django admin内联formset中的删除链接将消失

时间:2011-09-26 09:27:18

标签: django django-admin django-forms django-validation

我有一张KeywordInline的表单。当我使用表格内联formset添加新对象时,有一个js-link将新表单添加到formset中。新添加的表单有一个启用了js的删除按钮(右侧是x标记)。

KeywordInline

class KeywordInline(admin.TabularInline):
    fields = ('word',)
    model = models.Keyword
    formset = forms.KeywordFromset
    verbose_name = _('Keyword')
    verbose_name_plural = _('Keywords')
    extra = 1
    can_delete = True

    def get_readonly_fields(self, request, obj=None):
        if obj:
            if str(obj.status) == 'Finished':
                self.extra = 0
                self.can_delete = False
                self.max_num = obj.keyword_set.count()
                return ('word',)

        self.extra = 1
        self.can_delete = True
        self.max_num = None
        return []

KeywordFromset

class KeywordFromset(BaseInlineFormSet):
    def clean(self):
        super(KeywordFromset, self).clean()
        formset_keywords = set()
        for form in self.forms:
            if not getattr(form, 'cleaned_data', {}).get('word', None):
                keyword = None
            else:
                keyword = form.cleaned_data['word']
            if keyword in formset_keywords:
                form._errors['word'] = ErrorList([_(self.get_unique_error_message([_('Keyword')]))])
            else:
                formset_keywords.add(keyword)

现在,如果我点击“保存”按钮并且ValidationError上升,那么删除按钮将从设置中消失。因此,如果我错误地添加了错误的关键字,我就无法将其删除。

这是正常行为吗?我怎样才能使删除链接持续存在?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

触发ValidationError的内联没有删除链接,因为它们尚未保存到数据库,因此没有删除链接。

我意识到这是不一致的行为(因为你可以在点击“保存”按钮之前删除这些行,但是你不能一次触发验证错误),但它是Django如何做到的正常默认方式。

要解决此问题,您可以override the template for inline并在出现验证错误的情况下显示删除按钮。