1

場合によっては、保存時にカスタム シグナルを発するモデルを取得しました。

この「post_save」を実行すると、Django 管理者からアイテムを更新していない場合は正常に動作しますが、管理者を使用してアイテムを変更すると、想定されているすべてのことを実行しているログ メッセージが表示されます。しかし、それは保存されません。

これは、管理者がビュー レベルのロックを使用しているためであるというこの質問を見ました。ということで、シグナルハンドラへのtransaction.commit()追加も兼ねて実行してみました。@transaction.commit_manually残念ながら、データベースには何も保存されません。

更新:正しく保存されていないのは、以下のm2m関係です。organisations例外や発生するものはありません。管理者を介してデータベースに入れられないだけです。

参照用の私のハンドラー:

@transaction.commit_manually  # tried this as both first and second decorator
@receiver(node_moved, sender=Folder)
def folder_moved_handler(sender, instance, **kwargs):
    transaction.commit_manually()
    transaction.commit()

    # When a folder was so moved it became root
    if instance.is_root_node():
        # Copy these organisations to the new root
        inherit_permissions_from = instance.inherit_permissions_from
        print inherit_permissions_from

        instance.inherit_permissions_from = None
        instance.save()
        set_inherited_permissions_descendents(instance, None)

        if inherit_permissions_from:
            for org in inherit_permissions_from.organisations_with_access:
                instance.organisations.add(org)
                print 'add org: {0}'.format(org)

    else:
        instance.inherit_permissions_from = get_who_to_inherit_from(instance)
        instance.save()

    print 'returning'
    print transaction.commit()

私は今、何をすべきか途方に暮れています。長い目で見れば、一般的なワークフローが少しぎこちないので、このタスクに管理者を使用することから遠ざかっていますが、そのための時間ができるまで私はそれを機能させたいだけです。

私が思いついた唯一のことは、フラグを設定して、時々バッチジョブを実行することです。または、現時点では依存関係のない Celery に渡します。

助言がありますか?

4

2 に答える 2

1

次のように、フォームのを呼び出すsave_relatedonをオーバーライドできます。ModelAdminsave_m2m

class FolderAdmin(admin.ModelAdmin):
    form = FolderAdminForm

    def save_related(self, request, form, formsets, change):
         # Do my own fancy stuff
于 2013-07-16T14:53:20.343 に答える
0

問題はおそらくフォームにあると述べたこのコメントにリンクしました。保存後にフォームが m2m フィールドをリセットします。

それで、私はいくつか掘り下げて、このフォームを実行できるカスタム管理フォームを作成しようとしました。悲しいことに、それは運命にあるようです。管理者はフォームでコミットしません。保存されていないオブジェクトを吐き出すという形を取ります。次に、そのオブジェクト取得して保存し、最後にフォーム オブジェクト取得して保存します。

save_m2mon form はオーバーライドできないようです。ドキュメントが正しく動的に追加されていることを理解していればsave_m2m、カスタムフォームは何も停止しなかったので、今のところそれは本当だと思います。

そこで、私が修正しようとしているのは管理者向けではないという警告と、カスタム ビューへのリンクを追加します。そして、将来的には、アプリのこの部分の管理者の必要性を完全になくします。私が想像できるように使用することを意図したものではありませんでした。

MC ハマーの不滅の言葉を借りれば、これは触れません。

参考までに、私のモデルフォーム:

class FolderAdminForm(forms.ModelForm):
    def save_m2m(self):
        raise Exception('For the greater good') 

class FolderAdmin(admin.ModelAdmin):
    form = FolderAdminForm
于 2013-07-16T12:43:29.763 に答える