formfield_overrides
Djangoソースを読んで解決策を見つけました:カスタム管理者で設定するときにユーザーオブジェクトを渡します。
と の 2 つのモデルがNews
ありImage
ます。Image
名前フィールドとImageField
. News
モデルには、ForeignKey
画像を指す whichが含まれています。
class News(models.Model):
... bunch of news related fields
image = models.ForeignKey(Image)
次に、admin.py
ニュース用のカスタム管理クラスがあります。
class NewsAdmin(admin.ModelAdmin):
model = News
def get_form(self, request, obj=None, **kwargs):
self.formfield_overrides = {
models.ForeignKey : {'widget' : SelectForeign(user = request.user)}
}
return super(NewsAdmin, self).get_form(request, obj, **kwargs)
次にwidget.py
、カスタムウィジェットクラスがあります:
class SelectForeign(widgets.Widget): current_user = None
def __init__(self, attrs=None, choices=(), user = None):
self.current_user = None
super(SelectForegin, self).__init__(attrs, choices)
これで、ウィジェットには現在ログインしているユーザーが含まれるようになりました。それはかなりイモではありませんが、うまくいきます。
注:これにより、モデルForeignKey
内のすべてのフィールド
が置き換えられます。News
これを修正するには、カスタムForeignKey
サブクラスを使用して、そのサブクラスのみをオーバーライドできるようにする必要があります。
誰かがよりクリーンな解決策を持っている場合は、共有してください。受け入れます。