9

のフォームがありKeywordInlineます。フォームインラインフォームセットを使用して新しいオブジェクトを追加すると、新しいフォームをフォームセットに追加するためのjsリンクがあります。新しく追加されたフォームには、js 対応の削除ボタン (右側の x マーク) があります。

キーワードインライン

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 が発生すると、これらの削除ボタンが fromset から消えます。したがって、誤って間違ったキーワードを追加した場合、それを削除することはできません。

これは正常な動作ですか?また、削除リンクを永続化するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

2 に答える 2

6

ValidationError をトリガーしたインラインはデータベースにまだ保存されていないため、削除リンクはありません。したがって、削除リンクはありません。

私はそれが一貫性のない動作であることを認識しています(「保存」ボタンを押す前にこれらの行を削除できますが、検証エラーをトリガーすると削除できないため)が、Django の通常のデフォルトの方法です。

これを修正するには、インラインのテンプレートをオーバーライドして、検証エラーが発生しても削除ボタンを表示するようにします。

于 2011-10-04T13:40:09.020 に答える
0

私はdjango 2.2でこの問題を抱えています

最初に(機能していません)削除リンクを作成しようとしました

  • admin/edit_inline/tabular.html を複製して、プロジェクトで編集します

  • 新しいテンプレートを使用するように変更

      class MyAdminInline(admin.TabularInline):
          # ... other stuff
          template = 'admin/edit_inline/tabular.html'
    
  • いくつかのスクリプトを追加

      {% load i18n admin_urls static admin_modify %}
      <script type="text/javascript">
          function removeRowById(id, index) {
          document.getElementById(id).remove();
      }
      </script>
    
  • 表示方法を編集する リンクを削除する

      <td class="delete">
          {% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}
          {% if not inline_admin_form.original %} <div><a class="inline-deletelink" onclick="removeRowById('{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}', {{ forloop.counter0 }})">Remove</a></div> {% endif %}
      </td>
    
  • リンクボタンが表示されますが、保存すると表示されます。django は私に別のエラーをスローします。したがって、この方法では inline_admin_formset 内で更新されません

2番目 (WORKING) 別の方法を試す

  • 削除チェックボックスの表示方法を変更するだけです

      <td class="delete">
          {% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}
      </td>
    

    <td class="delete">
      {% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}
      {% elif not inline_admin_form.original %}
          {% if inline_admin_form.form.non_field_errors %}
            {{ inline_admin_form.deletion_field.field }}
          {% endif %}
      {% endif %}
    </td>

フィールドがオリジナルではなく (pk があり)、検証エラーがある場合に削除チェックボックスを表示する

ここに画像の説明を入力

于 2021-09-17T07:22:01.010 に答える