Ссылка на удаление исчезает в наборе встроенных форм администратора Django, если возникла ошибка ValidationError - PullRequest
9 голосов
/ 26 сентября 2011

У меня есть форма с KeywordInline. Когда я добавляю новый объект с помощью формы, у встроенного набора форм есть js-ссылка для добавления новой формы в набор форм. Недавно добавленные формы имеют кнопку удаления с поддержкой 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 Ответ

6 голосов
/ 04 октября 2011

Нет ссылки на удаление для встроенных строк, вызвавших ValidationError, поскольку они еще не сохранены в базе данных, следовательно, нет ссылки на удаление.

Я понимаю, что это противоречивое поведение (поскольку вы можете удалить эти строки перед нажатием "кнопка "Сохранить", но вы не можете, как только они вызвали ошибки проверки), но это обычный способ по умолчанию, как Django делает это.

Чтобы это исправить, вы можете переопределить шаблон для встроенного и заставить кнопки удаления появляться несмотря на ошибки проверки.

...