6

たとえば、ブックとページの 2 つのモデルがあります。ページには Book への外部キーがあります。

各ページは「was_read」(ブール値)としてマークできます。また、(管理者で)読み取られたページを削除したくありません。

管理者 - ページはブック内のインラインです (管理者でページをスタンドアロン モデルにしたくありません)。

私の問題 - 読み取られたページが削除されないという動作をどのように実現できますか? 私は Django 1.4 を使用しており、いくつかのオプションを試しました。

  1. 「delete」をオーバーライドして ValidationError をスローします。問題は、管理者が削除時に ValidationError を「キャッチ」せず、エラー ページが表示されることです。そのため、これは適切なオプションではありません。
  2. PageAdminInline でメソッドをオーバーライドします - has_delete_permission - ここでの問題 - タイプごとなので、すべてのページの削除を許可するか許可しないかのどちらかです。

HTMLコードをオーバーライドせずに他の良いオプションはありますか?

ありがとう、リー

4

4 に答える 4

9

解決策は次のとおりです (HTML コードは必要ありません)。

admin ファイルで、次のように定義します。

from django.forms.models import BaseInlineFormSet

class PageFormSet(BaseInlineFormSet):

    def clean(self):
        super(PageFormSet, self).clean()

        for form in self.forms:
            if not hasattr(form, 'cleaned_data'):
                continue                     

            data = form.cleaned_data
            curr_instance = form.instance
            was_read = curr_instance.was_read


            if (data.get('DELETE') and was_read):            
                raise ValidationError('Error')



class PageInline(admin.TabularInline):
    model = Page
    formset = PageFormSet
于 2013-02-11T19:54:31.373 に答える